gpt4 book ai didi

c# - TaskEx.Yield(TaskScheduler)

转载 作者:行者123 更新时间:2023-11-30 14:15:56 25 4
gpt4 key购买 nike

上个月我问了以下问题,这导致我学习了 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...

异步语言支持基于隐式调度上下文。我看不到这里需要依赖注入(inject)。如有必要,任何调用您的 async 方法的方法都可以提供自己的上下文。

你的选择:

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

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

Async CTP 的早期版本确实提供了一种“让步到另一个上下文”的方法,称为 SwitchTo。它was removed因为它太容易被滥用。

就我个人而言,我认为让您的 async 代码使用其调用方法提供的隐式调度上下文会更简洁。

附言创建和安装您自己的上下文(例如,用于测试目的)并不(太)困难。我写了AsyncContext作为单元测试和控制台程序的简单调度上下文。异步 CTP 带有用于测试的 GeneralThreadAffineContextWindowsFormsContextWpfContext。可以使用 SynchronizationContext.SetSynchronizationContext 安装其中任何一个。 IMO,DI 太过分了。

关于c# - TaskEx.Yield(TaskScheduler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8742522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com