2011-03-11 15 views
6

Hola Cuando uso siguiente código:Cómo desechar ManualResetEvent

myManualResetEvent.Dispose(); 

compilador da este error:

'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level. 

howevr línea siguiente funciona bien:

((IDisposable)myManualResetEvent).Dispose(); 

es que la forma correcta de deshacerse o en tiempo de ejecución podría colapsar en algunos escenarios.

Gracias.

+0

Creo que puede haber algún problema con su código de ejemplo. Si el compilador da "'System.Threading.WaitHandle.Dispose (bool)' es inaccesible debido a su nivel de protección." error que tenía que usar myManualResetEvent.Dispose (true); o myManualResetEvent.Dispose (false); no myManualResetEvent.Dispose(); –

Respuesta

16

Los diseñadores de la biblioteca de clases de .NET Base decidió poner en práctica el método Dispose usando explicit interface implementation:

private void IDisposable.Dispose() { ... } 

El método Dispose es privado y la única manera de llamarlo es lanzar el objeto a IDisposable como ha descubierto.

La razón por la que esto se hace es personalizar el nombre del método Dispose en algo que describa mejor cómo se elimina el objeto. Para un ManualResetEvent el método personalizado es el método Close.

Para disponer de un ManualResetEvent tiene dos buenas opciones. Usando IDisposable:

using (var myManualResetEvent = new ManualResetEvent(false)) { 
    ... 
    // IDisposable.Dispose() will be called when exiting the block. 
} 

o llamando Close:

var myManualResetEvent = new ManualResetEvent(false); 
... 
// This will dispose the object. 
myManualResetEvent.Close(); 

Usted puede leer más en la sección Customizing a Dispose Method Name en la guía de diseño Ejecución finalizar y Dispose para limpiar no administrado Recursos en MSDN:

Occasionally a domain-specific name is more appropriate than Dispose . For example, a file encapsulation might want to use the method name Close . In this case, implement Dispose privately and create a public Close method that calls Dispose .

3

WaitHandle.Close

This method is the public version of the IDisposable.Dispose method implemented to support the IDisposable interface.

2

Según the documentation, WaitHandle.Dispose() y WaitHandle.Close() son equivalentes. Dispose existe para permitir el cierre a través de la interfaz IDisposable. Para cerrar manualmente un WaitHandle (como un ManualResetEvent), puede simplemente usar Close directamente en lugar de Dispose:

WaitHandle.Close

[...] This method is the public version of the IDisposable.Dispose method implemented to support the IDisposable interface.

Cuestiones relacionadas