Digamos que tengo una clase que implementa la interfaz IDisposable. Algo como esto:¿Cómo deshacerse de forma asincrónica?
MiClase utiliza algunos recursos no administrados, de ahí la dispose() método de IDisposable comunicados de esos recursos. MiClase deben utilizarse como esto:
using (MyClass myClass = new MyClass()) {
myClass.DoSomething();
}
Ahora, yo quiero poner en práctica un método que llama HacerAlgo() de forma asíncrona. Añado un nuevo método para MiClase:
Ahora, desde el lado del cliente, MiClase deben utilizarse como esto:
using (MyClass myClass = new MyClass()) {
myClass.AsyncDoSomething();
}
Sin embargo, si no lo hago cualquier otra cosa, esto podría fallar ya que el objeto myClass podría eliminarse antes de DoSomething() se llama (y arrojar un inesperado ObjectDisposedException). Por lo tanto, la llamada al método Dispose() (ya sea implícita o explícita) debe retrasarse hasta que se realice la llamada asincrónica a DoSomething().
creo que el código en el método Dispose() debe ser ejecutado de manera asíncrona, y sólo una vez todas las llamadas asíncronas se resuelven. Me gustaría saber cuál podría ser la mejor manera de lograr esto.
Gracias.
NOTA: En aras de la simplicidad, no he ingresado los detalles de cómo se implementa el método Dispose(). En la vida real suelo seguir el Dispose pattern.
ACTUALIZACIÓN: Muchas gracias por sus respuestas. Le agradezco su esfuerzo. Como chakrithas commented, necesito que se realicen múltiples llamadas a la función asincrónica DoSomething. Lo ideal es que algo como esto debería funcionar bien:
using (MyClass myClass = new MyClass()) {
myClass.AsyncDoSomething();
myClass.AsyncDoSomething();
}
Voy a estudiar el semáforo de cuenta, parece que lo que estoy buscando. También podría ser un problema de diseño. Si lo encuentro conveniente, compartiré algunos fragmentos del caso real y lo que realmente hace MyClass.
En el uso (MyClass myclass = new ....) ejemplo, creo que el objeto myclass queda sin anclaje al final del bloque de uso y está disponible para ser Finalizado. Estoy bastante seguro de que es seguro que necesita llamar y bloquear en un método de espera antes del final del bloque de uso. –