Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

VB.Net 2005 Threadpool

Frage Entwicklung Visual Studio

Mitglied: kruemel666

kruemel666 (Level 1) - Jetzt verbinden

19.01.2009, aktualisiert 11:44 Uhr, 3641 Aufrufe, 1 Kommentar

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:
01.
Dim ti As Object = "\\Fileserver\" & oshare.Name 
02.
                    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf GetFolderSize), ti)
Das Sub mit Auslesen der Pfad Variable:
01.
Sub GetFolderSize(ByVal state As Object) 
02.
        Try 
03.
            Dim Dirpath = CType(state, String)
Und das Ende der Sub mit Aufruf der SQL-Schreibe-funktion und der Aktualisierung von 2 Steuerelementen:
01.
            SyncLock Me 
02.
                Me.dbentry(Dirpath, size2) 
03.
            End SyncLock 
04.
        Catch ex As Exception 
05.
            Dim DirPath As String = CStr(state(1)) 
06.
            MsgBox("Error in " & DirPath & ": " & ex.Message) 
07.
        End Try 
08.
 
09.
        Me.Invoke(New progressDelegate(AddressOf progress)) 
10.
        Me.Invoke(New txtdelegate(AddressOf timevorraus)) 
11.
End Sub
Kann mir jemand sagen wie ich die Threads beenden muß damit nicht ewig viel Ram gefressen wird?

Vielen Dank

Mit freundlichen Grüßen
Phil
Mitglied: kruemel666
20.01.2009 um 07:07 Uhr
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:
01.
Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean 
02.
 
03.
    Public Sub SetProcessWorkingSetSize() 
04.
        Try 
05.
            Dim Mem As Process 
06.
            Mem = Process.GetCurrentProcess() 
07.
            SetProcessWorkingSetSize(Mem.Handle, -1, -1) 
08.
        Catch ex As Exception 
09.
            MsgBox(ex.ToString) 
10.
        End Try 
11.
    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.

Mit freundlichen Grüßen
Phil
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Visual Studio
gelöst VB.Net - Problem mit Umleitung der Standard-Ausgabe (4)

Frage von emeriks zum Thema Visual Studio ...

Visual Studio
gelöst Vb.net Pfadangabe mit Wildcards wie Stern Regex Pattern (2)

Frage von Pilger83 zum Thema Visual Studio ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...