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

时间:2014-05-17 15:56:07

标签: c# async-await

According to an article in MSDN Magazine,最好“尽可能使用ConfigureAwait(false)。”此外,它指出,“如果你可以在一个方法中的某个时刻使用ConfigureAwait,那么我建议你在那个点之后的那个方法中使用它。” Stephen Cleary,该文章的作者,states on his blog“在您的'库'异步方法中,尽可能使用ConfigureAwait(false)[强调添加]。”

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

2 个答案:

答案 0 :(得分:15)

不,没有选择。微软团队确实考虑过编译器设置或者某种行为,但最终拒绝了它。

主要原因是在不知道如何设置编译器开关的情况下很难分辨代码的行为。

答案 1 :(得分:11)

There is now a third party library that supports this. The ConfigureAwait.Fody Nuget package allows you to use a ConfigureAwait attribute to mark a class, assembly or method such that all awaits should be .ConfigureAwait(false). The project page has this example usage: 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); } } I have not tried this myself, but given what I know about how Fody add-ins work, it is certainly possible.