Como descartar de forma assíncrona?
Digamos que eu tenho uma classe que implementa oIDisposable interface. Algo assim:
Minha classe usa alguns recursos não gerenciados, daí oDispose () método deIDisposable libera esses recursos.Minha classe deve ser usado assim:
using ( MyClass myClass = new MyClass() ) {
myClass.DoSomething();
}
Agora, eu quero implementar um método que chamaFaça alguma coisa() assincronamente. Eu adiciono um novo método paraMinha classe:
Agora, do lado do cliente,Minha classe deve ser usado assim:
using ( MyClass myClass = new MyClass() ) {
myClass.AsyncDoSomething();
}
No entanto, se eu não fizer mais nada, isso poderá falhar, pois o objetominha classe pode ser descartado antesFaça alguma coisa() é chamado (e lança um inesperadoObjectDisposedException) Então, a chamada para oDispose () (implícito ou explícito) deve ser adiado até que a chamada assíncrona paraFaça alguma coisa() é feito.
Eu acho que o código noDispose () método deve ser executadode forma assíncrona e apenas uma vez que todas as chamadas assíncronas sejam resolvidas. Eu gostaria de saber qual seria a melhor maneira de fazer isso.
Obrigado.
NOTA: Por uma questão de simplicidade, não inseri os detalhes de como o método Dispose () é implementado. Na vida real eu costumo seguir asDispor padrão.
ATUALIZAR: Muito obrigado por suas respostas. Eu aprecio o seu esforço. Comochakrit comentou, Eu preciso dissovárias chamadas para o DoSomething assíncrono podem ser feitas. Idealmente, algo assim deve funcionar bem:
using ( MyClass myClass = new MyClass() ) {
myClass.AsyncDoSomething();
myClass.AsyncDoSomething();
}
Vou estudar o semáforo de contagem, parece o que estou procurando. Também pode ser um problema de design. Se achar conveniente, compartilharei com você alguns trechos do caso real e quaisMinha classe realmente faz.