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

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

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

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

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

现在有一个支持这个的第三方库。 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); } } 

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