首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TaskFactory()与TaskFactory(CancellationToken)

使用TaskFactory()与TaskFactory(CancellationToken)
EN

Stack Overflow用户
提问于 2018-01-10 20:42:14
回答 1查看 298关注 0票数 0

当使用TaskFactory (默认构造函数)并希望您的任务可取消时,可以执行以下典型操作:

代码语言:javascript
复制
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。

这让我相信我能做到这一点:

代码语言:javascript
复制
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()用于一次性任务似乎更有意义(除非我有其他通用配置)。但我离题了。所以我就是这么想的,除了我在网上看到的一些例子,基本上是这样的:

代码语言:javascript
复制
TaskFactory factory = new TaskFactory(token);
factory.StartNew(() => DoSomeWork(token), token);

将相同的令牌传递给StartNew(),据称工厂被配置为自动与该工厂创建的任务相关联。所以我不确定我是否只是看到了一些他们不需要做的事情,或者我在这里误解了一些基本的东西。毕竟,如果我要显式地将令牌传递给StartNew(),那么将它传递给TaskFactory构造函数有什么意义呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-10 21:04:57

这是用于来源TaskFactory

构造者:

代码语言:javascript
复制
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参数的重载,以及它是如何实现的:

代码语言:javascript
复制
[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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48195729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档