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

c# – TaskEx.Yield(TaskScheduler)

发布时间:2020-12-16 01:50:23 所属栏目:百科 来源:网络整理
导读:上个月我问了以下问题,这导致我学习了TaskEx.Yield: Can async methods have expensive code before the first ‘await’? 但是,我已经意识到这个方法实际上将所有后续代码提交给环境TaskScheduler.在真正的DI精神中,我们的团队同意尽可能避免使用环境实例,
上个月我问了以下问题,这导致我学习了TaskEx.Yield:

Can async methods have expensive code before the first ‘await’?

但是,我已经意识到这个方法实际上将所有后续代码提交给环境TaskScheduler.在真正的DI精神中,我们的团队同意尽可能避免使用环境实例,所以我想知道是否可以明确指定要使用的TaskScheduler?

像下面这样的东西会很棒:

public static YieldAwaitable Yield(TaskScheduler taskScheduler)
{
    return new YieldAwaitable(taskScheduler);
}

但是,Async CTP的当前实现仅提供:

public static YieldAwaitable Yield()
{
    return new YieldAwaitable(SynchronizationContext.Current ?? TaskScheduler.Current);
}

以下是否会提供可接受的有效替代方案?

await Task.Factory.StartNew(() => { },CancellationToken.None,TaskCreationOptions.None,this.TaskScheduler);

解决方法

In true DI spirit,our team has agreed to avoid using ambient instances where possible…

异步语言支持基于隐式调度上下文.我不认为这里需要依赖注入.调用异步方法的任何方法都可以在必要时提供自己的上下文.

你的选择:

await Task.Factory.StartNew(() => { },this.TaskScheduler);

不会按预期工作.这会将noop lambda排队到特定的TaskScheduler,然后在隐式调度上下文中恢复该方法.

早期版本的Async CTP确实提供了“屈服于另一个上下文”方法,称为SwitchTo.它was removed因为它太容易被误用了.

就个人而言,我认为使用其调用方法提供的隐式调度上下文来保持异步代码更为清晰.

附:创建和安装您自己的上下文(例如,用于测试目的)并非(太)困难.我将AsyncContext编写为单元测试和控制台程序的简单调度上下文. Async CTP附带了GeneralThreadAffineContext,WindowsFormsContext和WpfContext用于测试.可以使用SynchronizationContext.SetSynchronizationContext安装其中任何一个. IMO,DI太过分了.

(编辑:李大同)

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

    推荐文章
      热点阅读