Task.Run()是否与创建Task实例然后启动()相同



这就是我一直使用的:

var task = Task.Run(DoSomething);

我想知道如果我用这个代替会不会有什么不同:

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

MSDN表示:

与调用此构造函数不同实例化Task对象并启动任务是通过调用static任务运行(操作)

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

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

然而,对于Start(),没有关于它正在使用的创建选项的信息。

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

根据这里的答案,current与default不同,current不应该与async/await结合使用,但我必须承认,我并不完全理解两者之间的区别,并想知道在决定Start()Task.Run()时这是否重要。

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

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

我还有一个博客系列(很抱歉,还没有结束!),详细介绍了Task的所有成员(以及相关类型),讨论了在哪些情况下最好使用它们中的哪一个。有趣的是,Task构造函数(讨论)或Task.Start(讨论)根本没有用例。总有更好的解决方案。

相关内容

最新更新