在using语句中调用异步方法

问题描述 投票:0回答:2

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

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

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

编辑:

根据@Servy 接受的答案的建议。实施改为:

public async Task Method()
{
    using(IDisposable disposeMe = new DisposableThing())
    {
        await MethodAsync(disposeMe);
    }
}
c# asynchronous
2个回答
10
投票

异步方法没有任何回调

好吧,这是个问题。一个非常大的问题。如果可能的话,你应该解决这个问题;除非有充分的理由不这样做,否则所有异步方法都应提供 some 方法让调用者知道它们何时完成,无论是回调、返回

Task
、触发事件等。一种依赖一次性资源来执行此操作的异步方法。

如果你真的没有办法在操作完成时得到通知,那么你就没有办法在方法完成后调用

Dispose
。确保在异步操作仍然需要资源时不释放资源的唯一方法是泄漏资源,根本不释放资源。如果一次性资源有一个终结器,它最终可能会被清理,但并不是所有的一次性资源都会这样做。

如果您 can 以某种方式修改异步方法,那么您只需要在回调中调用

Dispose
,或者在任务的延续中,或者在相关事件的处理程序中。你将无法使用
using
除非你可以
await
异步操作(因为
await
就是那样真棒)。


-1
投票

我对异步编程非常不了解。下面是基于用于解决类似问题的东西的建议(DbContext 在方法完成之前被处理)。 我想我是在要求在收到答案之前防止处置。

请在投票前发表评论。我是来学习的。

原创

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

建议

using(IDisposable disposeMe = new DisposableThing())
    {
        var task = MethodAsync(disposeMe);
        task.Wait();

    }
© www.soinside.com 2019 - 2024. All rights reserved.