我想使用异步调用发送消息,但在该过程中使用了一次性资源。我不确定如何正确处理这个问题。
using(IDisposable disposeMe = new DisposableThing())
{
MethodAsync(disposeMe);
}
任何想法如何做到这一点。异步方法没有任何回调。
编辑:
根据@Servy 接受的答案的建议。实现更改为:
public async Task Method()
{
using(IDisposable disposeMe = new DisposableThing())
{
await MethodAsync(disposeMe);
}
}
最佳答案
The async method does not have any callback
嗯,这是个问题。一个非常大的问题。如果可能的话,你应该解决这个问题;除非有很好的理由不这样做,否则所有异步方法都应该提供一些方法让调用者知道它们何时完成,无论是回调、返回Task
,触发事件等。对于依赖一次性资源来执行此操作的异步方法来说,这尤其麻烦。
如果您确实无法在操作完成时收到通知,那么您就无法在方法完成后调用 Dispose
。确保在异步操作仍然需要资源时不释放资源的唯一方法是泄漏资源,根本不释放资源。如果一次性资源有终结器,它最终可能会被清理,但并非所有一次性资源都会这样做。
如果您可以以某种方式修改异步方法,那么您只需在回调中调用Dispose
,或者在任务的延续中,或者在相关事件。你将无法使用 using
除非你可以 await
异步操作(因为 await
就是那样很棒)。
关于c# - 在using语句中调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431528/