Скажем, у меня есть класс, который реализует интерфейс IDisposable. Что-то вроде этого:
MyClass использует некоторые неуправляемые ресурсы, поэтому метод Dispose() из IDisposable освобождает эти ресурсы. MyClass следует использовать следующим образом:
using ( MyClass myClass = new MyClass() ) {
myClass.DoSomething();
}
Теперь я хочу реализовать метод, который вызывает DoSomething() асинхронно. Я добавлю новый метод в MyClass:
Теперь, со стороны клиента, MyClass следует использовать следующим образом:
using ( MyClass myClass = new MyClass() ) {
myClass.AsyncDoSomething();
}
Однако, если я ничего не делаю, это может потерпеть неудачу, поскольку объект myClass может быть удален до вызова DoSomething() (и выбросить неожиданное ObjectDisposedException). Таким образом, вызов метода Dispose() (неявный или явный) должен задерживаться до тех пор, пока не будет выполнен асинхронный вызов DoSomething().
Я думаю, что код в методе Dispose() должен выполняться асинхронным образом, и только один раз все асинхронные вызовы будут разрешены. Я хотел бы знать, какой может быть лучший способ выполнить это.
Спасибо.
ПРИМЕЧАНИЕ. Для простоты я не ввел подробные сведения о том, как реализован метод Dispose(). В реальной жизни я обычно следую Dispose pattern.
ОБНОВЛЕНИЕ: Большое вам спасибо за ваши ответы. Я ценю ваши усилия. Поскольку chakrit прокомментировал, мне нужно, чтобы несколько вызовов для async DoSomething можно было сделать. В идеале, что-то вроде этого должно работать нормально:
using ( MyClass myClass = new MyClass() ) {
myClass.AsyncDoSomething();
myClass.AsyncDoSomething();
}
Я изучу счетный семафор, похоже, что я ищу. Это также может быть проблемой дизайна. Если я нахожу это удобным, я поделюсь с вами некоторыми битами реального случая и тем, что действительно делает MyClass.