我最近在代码中看到了这一点:
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();