c# - 在using语句中调用异步方法

标签 c# asynchronous

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

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/

相关文章:

javascript - Sails.js 使用回调中的值设置模型值

c# - 查看项目是否存在于 Microsoft.Office.Interop.Word.Styles 集合中

c# - .NET 5 MySql 类型初始化异常 : CodeBase is not supported on assemblies loaded from a single-file bundle

c# - 构建 C# Web API - REST

python - 使用 Python 和 Twisted 的 DNS 服务器 - 异步操作的问题

javascript - while 循环中的异步方法与 Graph API 分页

c# - 如何使用触摸板 gearVR

c# - .NET : Unable to cast object to interface it implements

javascript - jQuery 加载的 html 内容 - 检查图像是否已加载和呈现

ios - 解析消息传递应用程序,需要找到一种方法来延迟代码执行,直到 deleteAllInBackground 执行完毕。包含详细代码