当使用TaskFactory (默认构造函数)并希望您的任务可取消时,可以执行以下典型操作:
Task.Factory.StartNew(() => DoSomeWork(token), token);
// or the equivilant
var factory = new TaskFactory();
factory.StartNew(() => DoSomeWork(token), token);根据MSDN,如果您使用的是TaskFactory()而不是TaskFactory(CancellationToken),那么:
将分配给此CancellationToken创建的任务的TaskFactory,除非在调用工厂方法时显式指定另一个CancellationToken。
这让我相信我能做到这一点:
TaskFactory factory = new TaskFactory(token);
factory.StartNew(() => DoSomeWork(token)); // don't need to pass token to StartNew()
... // imagine a few more tasks created just like above
// now create a special task that marches to its own drummer (token)
factory.StartNew(() => DoSomeWork(differentToken), differentToken);当然我为什么要这么做?将Task.Factory.StartNew()用于一次性任务似乎更有意义(除非我有其他通用配置)。但我离题了。所以我就是这么想的,除了我在网上看到的一些例子,基本上是这样的:
TaskFactory factory = new TaskFactory(token);
factory.StartNew(() => DoSomeWork(token), token);将相同的令牌传递给StartNew(),据称工厂被配置为自动与该工厂创建的任务相关联。所以我不确定我是否只是看到了一些他们不需要做的事情,或者我在这里误解了一些基本的东西。毕竟,如果我要显式地将令牌传递给StartNew(),那么将它传递给TaskFactory构造函数有什么意义呢?
发布于 2018-01-10 21:04:57
这是用于来源的TaskFactory
构造者:
public TaskFactory(CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
{
CheckMultiTaskContinuationOptions(continuationOptions);
CheckCreationOptions(creationOptions);
m_defaultCancellationToken = cancellationToken;
m_defaultScheduler = scheduler;
m_defaultCreationOptions = creationOptions;
m_defaultContinuationOptions = continuationOptions;
}下面是一个没有CancellationToken参数的重载,以及它是如何实现的:
[MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable
public Task<TResult> StartNew<TResult>(Func<TResult> function)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
Task currTask = Task.InternalCurrent;
return Task<TResult>.StartNew(currTask, function, m_defaultCancellationToken,
m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(currTask), ref stackMark);
}如您所见,当您不使用带有m_defaultCancellationToken参数的构造函数时,将使用构造函数中的CancellationToken。
因此,只有在没有重载CancellationToken的情况下使用TaskFactory.StartNew时,才能在构造函数中传递CancellationToken。
https://stackoverflow.com/questions/48195729
复制相似问题