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

Posted

技术标签:

【中文标题】为整个项目/dll 设置 ConfigureAwait(false)【英文标题】:Set ConfigureAwait(false) for entire project/dll 【发布时间】:2014-07-05 23:21:02 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

不,没有这个选项。 Microsoft 团队确实考虑了针对该行为的编译器设置或其他东西,但最终拒绝了。

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

【讨论】:

如果有一个属性我们可以应用到一个指定默认值 ConfigureAwait 的类或函数,那肯定会很有用。 可以很好地在任何测试框架中测试 ConfigAwait(false)。任何人都知道这种功能是否存在于任何框架中。 @AbdulSaboor:现在有一些代码分析器可以强制您始终使用ConfigureAwaittruefalse),以使其明确。我个人不使用它们,但我可以看到它们的好处,尤其是在大型团队中。【参考方案2】:

现在有一个第三方库支持这一点。 ConfigureAwait.Fody Nuget 包允许您使用ConfigureAwait 属性来标记类、程序集或方法,以便所有等待都应为.ConfigureAwait(false)。 project page 有这个示例用法:

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 插件如何工作的了解,这当然是可能的。

【讨论】:

ConfigureAwait.Fody 是个好主意,但目前的实现有问题,似乎没有得到积极的支持 因此,它从 nuget 中未列出。 当时的版本是 2.0.0,现在是 2.1.0。

以上是关于为整个项目/dll 设置 ConfigureAwait(false)的主要内容,如果未能解决你的问题,请参考以下文章

VS2005发布生成网站时如何设置固定的dll文件名?

VS2008发布生成网站时如何设置固定的dll文件名?

如何从 Eclipse 设置 java.library.path

C#调用DLL问题

如何设置 Visual Studio 2010 项目来为 Slickedit 17 构建 64 位扩展 dll?

Visual Studio 2019 为 .tlog 和 .dll.recipe 文件设置输出目录