在using语句中调用异步方法

时间:2013-12-06 18:57:37

标签: c# asynchronous

我想使用异步调用发送消息,但在此过程中使用了可用资源。我不确定如何正确处理这个问题。

using(IDisposable disposeMe = new DisposableThing())
{
    MethodAsync(disposeMe);
}

任何想法如何做到这一点。 async方法没有任何回调。

编辑:

基于@Servy接受的答案的建议。实施改为:

public async Task Method()
{
    using(IDisposable disposeMe = new DisposableThing())
    {
        await MethodAsync(disposeMe);
    }
}

1 个答案:

答案 0 :(得分:10)

  

async方法没有任何回调

那是一个问题。一个非常大的问题。如果可能的话你应该解决这个问题;除非有充分理由不这样做,否则所有异步方法都应该为调用者提供一些方法,以便知道它们何时完成,是否为回调,返回Task,触发事件对于依赖于一次性资源的异步方法来说,这尤其令人不安。

如果您确实无法在操作完成时收到通知,则在方法完成后无法调用Dispose。确保在异步操作仍然需要时不要处理资源的唯一方法是泄漏资源而不是完全丢弃它。如果一次性资源有一个终结器,它最终可能会被清理掉,但不是所有的一次性资源都这样做。

如果你可以以某种方式修改异步方法,那么你只需要在回调中,或在任务的延续中,或在相关事件的处理程序中调用Dispose。您将无法使用using,除非您可以await进行异步操作(因为await非常棒)。