Task.Run()与创建Task实例相同,然后Start()吗?

时间:2016-04-07 18:50:55

标签: c# async-await task

这是我一直使用的:

var task = Task.Run(DoSomething);

我想知道如果我改用它会有所作为:

var task = new Task(DoSomething);
task.Start();

MSDN说:

  

而不是调用此构造函数,这是最常见的方法   实例化一个Task对象并通过调用static来启动任务   Task.Run(动作)

在第一种情况下,任务立即启动。这是一个明显的区别,但除此之外我不清楚是否存在任何(相关)差异。

MSDN没有说明使用的选项是否相同。 对于Task.Run()他们document它将使用DenyChildAttach和它将使用默认调度程序。

但是Start()对于它正在使用的创建选项有no word

但还有另一个区别:Start()将使用当前任务调度程序,而不是默认

根据这里的answer,当前与默认值不同,当前不应该与async / await结合使用,但是我必须承认我并不完全理解两者之间的区别并且在决定Start()Task.Run()时是否重要。

长话短说:看到差异,我想知道它们与async / await结合使用时是否相关?如果它们相关,那为什么呢? MSN文档仅说我可能想使用Task.Run(),但他们没有解释为什么

1 个答案:

答案 0 :(得分:3)

StartNew类似于Task.Start的任务构造函数。我有一篇博文,其中详细介绍了major problems of StartNew,这两篇文章都适用于任务构造函数和Task.Start。特别是,构造函数不理解异步委托,Start默认使用当前的调度程序而不是默认的调度程序。

我还有一个blog series(尚未完成,抱歉!)详细介绍了所有Task成员(和相关类型),讨论哪些成员最适合使用哪个的情况。有趣的是,Task构造函数(discussion)或Task.Startdiscussion)根本没有用例。总有一个更好的解决方案。