异步世界中的故障安全处理

spe*_*der 12 c# idisposable

在同步世界中,C#使所有事物的管理变得非常容易:

using(IDisposable someDisposable=bla.bla())
{
     //do our bidding
}
//don't worry too much about it
Run Code Online (Sandbox Code Playgroud)

但是,当我们进行异步时,我们不再具有using块的便利性.我遇到的最好的策略之一是CCR迭代器,它允许我们使用异步代码"好像它是同步的".这意味着我们可以将我们的using块保留在迭代器处理程序中,而不会在何时处理和捕获需要处理的所有情况的复杂决策中陷入困境.

然而,在许多情况下,调用CCR看起来有点矫枉过正,说实话,虽然我对CCR很满意,但对于初学者来说它看起来像是双重的.

所以我的问题是:当一次性物品必须超出直接范围时,管理一个人的IDisposable还有哪些其他策略?

spe*_*der 0

事实证明,这个问题也在语言设计者的脑海中浮现。

这个问题的正确答案现在是使用Task为几乎所有异步操作提供的异步 API 的基础版本,再加上新的 C# async/await关键字。这些使我们能够在异步操作的生命周期中将所有内容保持在范围内:

async Task<int> DoSomething()
{
    using(var foo = new SomeDisposableThing())
    {
         await foo.DoSomethingAsync();
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)