我想使用异步调用发送消息,但在该过程中使用了一次性资源。我不确定如何正确处理这个问题。
using(IDisposable disposeMe = new DisposableThing())
{
MethodAsync(disposeMe);
}
任何想法如何做到这一点。异步方法没有任何回调。
编辑:
根据@Servy 接受的答案的建议。实施改为:
public async Task Method()
{
using(IDisposable disposeMe = new DisposableThing())
{
await MethodAsync(disposeMe);
}
}
异步方法没有任何回调
好吧,这是个问题。一个非常大的问题。如果可能的话,你应该解决这个问题;除非有充分的理由不这样做,否则所有异步方法都应提供 some 方法让调用者知道它们何时完成,无论是回调、返回
Task
、触发事件等。一种依赖一次性资源来执行此操作的异步方法。
如果你真的没有办法在操作完成时得到通知,那么你就没有办法在方法完成后调用
Dispose
。确保在异步操作仍然需要资源时不释放资源的唯一方法是泄漏资源,根本不释放资源。如果一次性资源有一个终结器,它最终可能会被清理,但并不是所有的一次性资源都会这样做。
如果您 can 以某种方式修改异步方法,那么您只需要在回调中调用
Dispose
,或者在任务的延续中,或者在相关事件的处理程序中。你将无法使用 using
除非你可以 await
异步操作(因为 await
就是那样真棒)。
我对异步编程非常不了解。下面是基于用于解决类似问题的东西的建议(DbContext 在方法完成之前被处理)。 我想我是在要求在收到答案之前防止处置。
请在投票前发表评论。我是来学习的。
原创
using(IDisposable disposeMe = new DisposableThing())
{
MethodAsync(disposeMe);
}
建议
using(IDisposable disposeMe = new DisposableThing())
{
var task = MethodAsync(disposeMe);
task.Wait();
}