When loading a particular form in a project of mine I needed to shift the location of most of my controls to “hide” an unused textbox based on a boolean. I was going to simply loop through each control and ignore the shift in location if the name values were the two controls that were fixed but I thought about how LINQ to Objects could help. While this is simple and probably overkill the potential is awesome.
1
2
3
4
5
6
| Dim res = From ctrl In Controls.OfType(Of Control)() _
Where ctrl.Name <> "txtAddress" AndAlso ctrl.Name <> "lblAddress"
For Each ctrl As Control In res
ctrl.Top -= val
Next |
Admittedly this is pretty boring. But say you wanted to change the background color of all textboxes on a form that contain a string greater than 255 and are not read only.
1
2
3
4
5
6
| Dim res = From ctrl In Controls.OfType(Of TextBox)() _
Where ctrl.Text.Length > 255 And ctrl.ReadOnly = False
For Each ctrl As Control In res
ctrl.BackgroundColor = Colors.Red
Next |
Very quickly you can see how LINQ can be a convenient tool for all sorts of problems. And ends up being very, very readable as well.
Recently I was working on a mobile project that was experiencing some serious memory leak issues. It turns out that I wasn’t disposing for a SqlCeResultSet properly and on each query (of which there was substantial amount) I was calling New() without Dispose().
After a day of feeling like my project was falling apart before my eyes and getting weird and unreliable results from the .NETCF Remote Profiler I searched far a wide for some way to determine the available memory on a device. On MSDN I found the following code (slightly modified by me) to get relevant information.
Basically two P/Invokes later I had the information I needed, saw that I was in fact leaking memory, quickly determined where, and restored sanity to my project. Within thirty minutes of implementing this class the world was a happier place for me.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| Imports System.Text
Public Class MEMORYSTATUSINFO
Public Structure MEMORYSTATUS
Public dwLength As UInt32
Public dwMemoryLoad As UInt32
Public dwTotalPhys As UInt32
Public dwAvailPhys As UInt32
Public dwTotalPageFile As UInt32
Public dwAvailPageFile As UInt32
Public dwTotalVirtual As UInt32
Public dwAvailVirtual As UInt32
End Structure
Public Declare Function GlobalMemoryStatus Lib "CoreDll.Dll" _
(ByRef ms As MEMORYSTATUS) As Integer
Public Declare Function GetSystemMemoryDivision Lib "CoreDll.Dll" _
(ByRef lpdwStorePages As UInt32, _
ByRef ldpwRamPages As UInt32, _
ByRef ldpwPageSize As UInt32) As Integer
Public Shared Function ShowMemory() As String
Dim storePages As UInt32
Dim ramPages As UInt32
Dim pageSize As UInt32
Dim res As Integer = _
GetSystemMemoryDivision(storePages, ramPages, pageSize)
' Call the native GlobalMemoryStatus method
' with the defined structure.
Dim memStatus As New MEMORYSTATUS
GlobalMemoryStatus(memStatus)
Dim load As Integer = memStatus.dwMemoryLoad / (1024 * 1024)
Dim totPhys As Integer = memStatus.dwTotalPhys / (1024 * 1024)
Dim availPhys As Integer = memStatus.dwAvailPhys / (1024 * 1024)
Dim totalPageFile As Integer = memStatus.dwTotalPageFile
Dim availPageFile As Integer = memStatus.dwAvailPageFile
Dim totVirtual As Integer = memStatus.dwTotalVirtual / (1024 * 1024)
Dim availVirtual As Integer = memStatus.dwAvailVirtual / (1024 * 1024)
' Use a StringBuilder for the message string.
Dim MemoryInfo As New StringBuilder
MemoryInfo.Append("Memory Load: " _
& load.ToString() & "Mb" & vbCrLf)
MemoryInfo.Append("Total Physical: " _
& totPhys & "Mb" & vbCrLf)
MemoryInfo.Append("Avail Physical: " _
& availPhys & "Mb" & vbCrLf)
MemoryInfo.Append("Total Page File: " _
& totalPageFile.ToString() & vbCrLf)
MemoryInfo.Append("Avail Page File: " _
& availPageFile.ToString() & vbCrLf)
MemoryInfo.Append("Total Virtual: " _
& totVirtual.ToString() & "Mb" & vbCrLf)
MemoryInfo.Append("Avail Virtual: " _
& availVirtual.ToString() & "Mb" & vbCrLf)
' Show the available memory.
Return MemoryInfo.ToString()
End Function
End Class |
Hope this helps someone else find greedy memory hog code in their apps.