为整个项目/ dll设置ConfigureAwait(false)

Jef*_*ger 19 c# async-await

根据MSDN杂志上的一篇文章,"尽可能使用"是最佳做法ConfigureAwait(false).此外,它指出,"如果你可以ConfigureAwait在一个方法中的某个时刻使用,那么我建议你在那个点之后的那个方法中使用它." 该文章的作者Stephen Cleary 在他的博客中指出"在你的'库'异步方法中,尽可能使用ConfigureAwait(false)[强调添加]."

鉴于我await在库项目中的大部分或全部语句应该被广泛使用,是否.ConfigureAwait(false)可以做某事/更改设置以使其在我的项目/ dll中等待的默认行为不能继续在捕获的上下文?也就是说,我可以省略所有调用.ConfigureAwait(false),而只在我需要保留上下文时添加..ConfigureAwait(true)

Ste*_*ary 16

不,没有选择.Microsoft团队确实考虑了编译器设置或该行为的某些内容,但最终拒绝了它.

主要原因是如果不知道如何设置编译器开关,很难说出代码的行为方式.

  • 如果有一个属性可以应用于指定了ConfigureAwait默认值的类或函数,那肯定会很有用. (5认同)

Jef*_*ger 11

现在有第三方库支持这一点.该ConfigureAwait.Fody NuGet包可以让你用一个ConfigureAwait属性标记一个类,组件或方法,使得所有等待着要.ConfigureAwait(false).该项目页面有此用法示例:

using Fody;

[ConfigureAwait(false)]
public class MyAsyncLibrary
{
    public async Task MyMethodAsync()
    {
        await Task.Delay(10);
        await Task.Delay(20);
    }

    public async Task AnotherMethodAsync()
    {
        await Task.Delay(30);
    }
}
Run Code Online (Sandbox Code Playgroud)

我自己没有尝试过这个,但鉴于我对Fody插件如何工作的了解,它肯定是可能的.

  • ConfigureAwait.Fody是一个好主意,但当前的实现是错误的,似乎没有积极支持 (3认同)