加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在异步方法中调用ConfigureAwait(false)是否有更可读的替

发布时间:2020-12-15 04:36:14 所属栏目:百科 来源:网络整理
导读:我正在编写大量的异步库代码,我知道在每次异步调用之后添加ConfigureAwait(false)的做法,以避免将继续代码编组回原来的(通常是UI)线程上下文.因为我不喜欢未标记的布尔参数,所以我倾向于将其写为ConfigureAwait(continueOnCapturedContext:false). 我添加了
我正在编写大量的异步库代码,我知道在每次异步调用之后添加ConfigureAwait(false)的做法,以避免将继续代码编组回原来的(通常是UI)线程上下文.因为我不喜欢未标记的布尔参数,所以我倾向于将其写为ConfigureAwait(continueOnCapturedContext:false).

我添加了一个扩展方法,使其更易读(并减少打字有些):

public static class TaskExtensions
{
    public static ConfiguredTaskAwaitable<TResult> WithoutCapturingContext<TResult>(this Task<TResult> task)
    {
        return task.ConfigureAwait(continueOnCapturedContext: false);
    }

    public static ConfiguredTaskAwaitable WithoutCapturingContext(this Task task)
    {
        return task.ConfigureAwait(continueOnCapturedContext: false);
    }
}

所以现在我可以有一些东西像等待SomethingAsync().WithoutCapturingContext()而不是等待SomethingAsync().ConfigureAwait(continueOnCapturedContext:false).我认为这是一个改进,但是即使这样,当我必须在同一个代码块中调用一些异步方法时,我开始琢磨,因为我最终得到了类似的东西:

await FooAsync().WithoutCapturingContext();
var bar = await BarAsync().WithoutCapturingContext();
await MoreFooAsync().WithoutCapturingContext();
var moreBar = await MoreBarAsync().WithoutCapturingContext();
// etc,etc

在我看来,它开始使代码变得不太可读.

我的问题基本是这样的:有没有办法进一步减少(除了缩短扩展方法的名称)?

解决方法

没有全局设置来阻止方法中的任务捕获同步上下文,但是您可以做的只是改变同步上下文,仅仅是该方法的范围.在您的具体情况下,您可以将上下文更改为默认同步上下文,仅用于该方法的范围.

编写一个简单的一次性类可以改变同步上下文,然后在处理时将其更改:

public class SyncrhonizationContextChange : IDisposable
{
    private SynchronizationContext previous;
    public SyncrhonizationContextChange(SynchronizationContext newContext = null)
    {
        previous = SynchronizationContext.Current;
        SynchronizationContext.SetSynchronizationContext(newContext);
    }

    public void Dispose()
    {
        SynchronizationContext.SetSynchronizationContext(previous);
    }
}

让你写:

using(var change = new SyncrhonizationContextChange())
{
    await FooAsync();
    var bar = await BarAsync();
    await MoreFooAsync();
    var moreBar = await MoreBarAsync();
}

(注意将上下文设置为null表示将使用默认上下文.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读