Ereignisbehandlung von Lecks in einer .NET Framework 4-basierten Anwendung

Dieser Artikel hilft Ihnen bei der Behebung von Lecks in einer .NET Framework 4-basierten Anwendung.

Ursprüngliche Produktversion:   Microsoft .NET Framework 4
Ursprüngliche KB-Nummer:   2973904

Zusammenfassung

Dieses Problem kann auch auftreten, wenn sich die Anwendung im Leerlauf befindet. Wenn Sie den Prozess dieser Anwendung mithilfe eines Debugtools untersuchen, sieht der Stapel außerdem wie folgt aus, in dem die Ereignishandles zugewiesen werden:

Ntdll! ZwCreateEvent
Kernelbasis! CreateEventExW+0x6e
Kernelbasis! CreateEventW+0x27
Clr! CLREvent::CreateManualEvent+0x3b
Clr! Thread::AllocHandles+0xa3
Clr! Thread::CreateNewOSThread+0x85
Clr! Thread::CreateNewThread+0xa9
Clr! ThreadpoolMgr::CreateUnimpersonatedThread+0xbb
Clr! ThreadpoolMgr::CreateWorkerThread+0x19
Clr! ThreadpoolMgr::EnsureEnoughWorkersWorking+0x116
Clr! ThreadpoolMgr::AddWorkingWorker+0x12
Clr! UnManagedPerAppDomainTPCount::D ispatchWorkItem+0x266
Clr! ThreadpoolMgr::NewWorkerThreadStart+0x20b
Clr! ThreadpoolMgr::WorkerThreadStart+0x3d1
Clr! Thread::intermediateThreadProc+0x4b
Kernel32.dll! BaseThreadInitThunk+0xe
ntdll!__RtlUserThreadStart+0x70
ntdll!_RtlUserThreadStart+0x1b

Ursache

Das Problem tritt auf, weil die .NET Framework nicht sofort den Speicher freigeben, der diesen Handles zugeordnet ist. Die Handles werden nur dann freigegeben, wenn eine Garbage Collection ausgeführt wird. Bei einigen Anwendungen erfolgt die Garbage Collection nur selten, da die Anwendung nur selten verwaltete Objekte zuordnet.

Lösung

Um dieses Problem zu beheben, führen Sie ein Upgrade von .NET Framework 4 auf die neueste Version der .NET Framework 4.5 durch.

Problemumgehung

Um dieses Problem im .NET Framework 4 zu umgehen, rufen Sie die Methode auf, GC.Collect() wenn die Anwendung die Handles sofort freigeben muss.