我最近在代码中看到了这一点:

await QueryAsync.ConfigureAwait(SynchronizationContext.Current is not null || TaskScheduler.Current != TaskScheduler.Default)

我的第一react 是,"这不对",但真的吗?

我的理解是,如果没有当前的同步上下文,我们应该使用.ConfigureAWait(FALSE).如果有当前的同步上下文,我们可能(注意大写的‘可能’)需要使用.ConfigureAWait(True),这基本上与根本不使用.ConfigureAWait相同.

如果我的理解是正确的(很可能不是),那么该代码将会工作,并且可以放入扩展中以使其更加简洁.

我说的对吗?

我试着测试了一下,它似乎可以工作.当有同步上下文时,调用.ConfigureAwait(true),当SynchronizationContext.Current为null时,调用.ConfigureAwait(false).

编辑:为了清楚起见,如果没有当前的SynchronizationContext,也没有定制的TaskScheduler,则此代码的计算结果为:

await QueryAsync().ConfigureAwait(false);

当存在当前SynchronizationContext或自定义TaskScheduler时,它的计算结果为:

await QueryAsync().ConfigureAwait(true);

根据TO this article,这基本上等同于:

await QueryAsync();

推荐答案

问题中的代码:

await QueryAsync().ConfigureAwait(SynchronizationContext.Current is not null ||
    TaskScheduler.Current != TaskScheduler.Default);

...相当于:

await QueryAsync();

.ConfigureAwait(true)是默认值,因此可以省略.如果在await点没有同步上下文要捕获,则.ConfigureAwait(true).ConfigureAwait(false)的行为相同.

换句话说,这段复杂的代码完全是虚无的.

Csharp相关问答推荐

在Dapper中使用IasyncEum重写GetAsyncEum方法

将修剪声明放入LINQ中

向类注入一个工厂来创建一些资源是一个好的实践吗?

将委托传递到serviceccollection c#web API

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

如何删除文件的基础上嵌入的时间戳嵌入文件名

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

如何通过寻找向量长度来优化两个循环?

集合表达式没有目标类型

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

关于扩展文件类C#的矛盾

Google OAuth令牌交换在.Net中不起作用

如何更改新创建的实例的变量?

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

在集成测试中可以在模拟InMemory数据库中设定数据种子

匿名类型的AbstractValidator

在C#中,当输入一个方法/局部函数时,我的IEnumerator被重置/重新创建.为什么?

使用可空引用类型时C#接口实现错误

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

SignalR跨域