Perdite di handle di eventi in un'applicazione basata su .NET Framework 4

Questo articolo consente di risolvere le perdite di eventi in un'applicazione basata su .NET Framework 4.

Versione originale del prodotto: Microsoft .NET Framework 4
Numero KB originale: 2973904

Riepilogo

Questo problema può verificarsi anche quando l'applicazione è inattiva. Inoltre, se si esamina il processo di questa applicazione usando uno strumento di debug, lo stack sarà simile al seguente in cui vengono allocati gli handle di eventi:

ntdll! ZwCreateEvent
kernelbase! CreateEventExW+0x6e
kernelbase! 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! BaseThreadInitThunk+0xe
ntdll!__RtlUserThreadStart+0x70
ntdll!_RtlUserThreadStart+0x1b

Causa

Il problema si verifica perché .NET Framework non recupera immediatamente la memoria associata a questi handle. Gli handle vengono recuperati solo quando viene eseguita una Garbage Collection. Per alcune applicazioni, Garbage Collection si verifica raramente, perché l'applicazione alloca raramente oggetti gestiti.

Risoluzione

Per risolvere questo problema, eseguire l'aggiornamento da .NET Framework 4 alla versione più recente di .NET Framework 4.5.

Soluzione alternativa

Per risolvere questo problema in .NET Framework 4, chiamare il GC.Collect() metodo quando l'applicazione deve recuperare immediatamente gli handle.