kruemel666
Goto Top

VB.Net 2005 Threadpool

Hallo zusammen,

ich habe ein kleines Programm geschrieben welches die Größe alle Shares unseres Fileservers ausliest und in eine SQL Datenbank schreibt. Da es über 1000 Shares sind gehe ich wie folgt vor: In einer For-Next schleife lese ich alle Shares in ein Array ein.
Anschließend übergebe ich alle Shares in einer 2. For-Next schleife an einen Threadpool.

Der Threadpool startet eine Sub welches dann die Größe des Shares erfasst und es in die SQL Datenbank einträgt.

Mein Problem ist jetzt das ich immer mehr Threads bekomme und das Programm den Arbeitsspeicher frisst. Meiner Meinung nach läst ein Threadpool doch nur 25 Threads zu. Also dürfte nur 25 dieser Subs laufen und wenn eins fertig ist startet er das nächste aus der Warteschlange oder lieg ich da falsch?

Zur verdeutlichung etwas Code:

Übergabe an den Threadpool:
Dim ti As Object = "\\Fileserver\" & oshare.Name  
                    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf GetFolderSize), ti)

Das Sub mit Auslesen der Pfad Variable:
Sub GetFolderSize(ByVal state As Object)
        Try
            Dim Dirpath = CType(state, String)

Und das Ende der Sub mit Aufruf der SQL-Schreibe-funktion und der Aktualisierung von 2 Steuerelementen:
            SyncLock Me
                Me.dbentry(Dirpath, size2)
            End SyncLock
        Catch ex As Exception
            Dim DirPath As String = CStr(state(1))
            MsgBox("Error in " & DirPath & ": " & ex.Message)  
        End Try

        Me.Invoke(New progressDelegate(AddressOf progress))
        Me.Invoke(New txtdelegate(AddressOf timevorraus))
End Sub

Kann mir jemand sagen wie ich die Threads beenden muß damit nicht ewig viel Ram gefressen wird?

Vielen Dank

MfG
Phil

Content-Key: 106437

Url: https://administrator.de/contentid/106437

Printed on: April 28, 2024 at 05:04 o'clock

Member: kruemel666
kruemel666 Jan 20, 2009 at 06:07:59 (UTC)
Goto Top
Hallo zusammen,

ich habe es inzwischen geschafft das die Threads beendet werden und auch wirklich aus dem Task-Manager rausfliegen. Ich habe jetzt allerdings das Problem das der verbrauchte Arbeitsspeicher nicht sinkt.

Auch nicht wenn ich GC.Collect aufrufe. Die einzige Möglichkeit den verbrauchten Arbeitsspeicher zu senken ist mit diesem Code:
Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean  

    Public Sub SetProcessWorkingSetSize()
        Try
            Dim Mem As Process
            Mem = Process.GetCurrentProcess()
            SetProcessWorkingSetSize(Mem.Handle, -1, -1)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

Das ganze bewirkt aber nur das der ganze Müll ins Pagefile geschrieben wird. Ich hab auch meinen kompletten Quelltext schon überprüft und jede Variable mit = Nothing am Schluß geschlossen. Objekte habe ich mit .Dispose() geschlossen.

Gibt es eine Möglichkeit den Speicher den ein Thread belegt wieder frei zu geben sodass wirklich nur das im Speicher ist was auch wirklich grade läuft. Und nicht das das Programm je länger es läuft desto mehr Speicher belegt.

MfG
Phil