Jeśli używam EventWaitHandle
(lub AutoResetEvent
, ManualResetEvent
) do synchronizacji między wątkami, czy muszę wywoływać metody Close()
lub Dispose()
na tym uchwycie zdarzenia, gdy skończę z nim?Czy muszę usunąć() lub zamknąć() EventWaitHandle?
EventWaitHandle
dziedziczy po WaitHandle
, która implementuje IDisposable
. A FxCop narzeka, jeśli nie zaimplementuję IDisposable
na żadnej klasie zawierającej EventWaitHandle
. Sugeruje to, że muszę to nazwać.
Jednak żaden z tych przykładów użytkowania MSDN zadzwonić Dispose()
lub Close()
:
http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(VS.80).aspx
Jest to tylko przykład Microsoft ignorując własne rady?
Twierdzę, że pozwolenie GC na zbieranie jest całkiem niepożądane. Pozostawienie pracy w wątku Finalizer to tylko zła praktyka. Jest tylko jeden wątek finalizatora i sprawiający, że robi więcej, niż powinien, nie jest dobry. Jeśli wątek zostanie zablokowany, Twoja aplikacja zostanie zawieszona. Jeśli wyjątek zostanie zgłoszony w wątku finalizatora, Twoja AppDomain ulega awarii. Posiadanie odpowiedniego wzorca pozbywania się gwarantuje, że GC.SuppressFinalize() jest wywoływana, co tłumi finalizację tego obiektu. Mam przykład implementacji IDisposable - http://dave-black.blogspot.com/2011/03/how-do-you-properly-implement.html –
Zgadzam się i dlatego oświadczam, że powinieneś jawnie nazwać "Dispose" '. –