C# Task.Run()与创建任务实例然后启动()相同吗?

C# Task.Run()与创建任务实例然后启动()相同吗?,c#,async-await,task,C#,Async Await,Task,这是我一直使用的: var task=task.Run(DoSomething) 我想知道如果我用这个来代替,是否会有所不同: var task = new Task(DoSomething); task.Start(); 说: 而不是调用此构造函数,最常见的方法是 通过调用静态 Task.Run(操作) 在第一种情况下,任务立即启动。这是一个明显的区别,但除此之外,我不清楚是否有任何(相关的)区别 MSDN没有说明使用的选项是否相同。 对于Task.Run()他们希望它将使用denychil

这是我一直使用的:

var task=task.Run(DoSomething)

我想知道如果我用这个来代替,是否会有所不同:

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

而不是调用此构造函数,最常见的方法是 通过调用静态 Task.Run(操作)

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

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

但是,对于
Start()
来说,它使用的创建选项是不正确的

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

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


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

StartNew
类似于带有
Task.Start
的任务构造函数。我有一篇博文详细介绍了这两种方法,这两种方法都适用于任务构造函数和
task.Start
。特别是,构造函数不理解异步委托,默认情况下,
Start
使用当前调度程序,而不是默认调度程序


我还有一个(抱歉,还没有完成!)详细介绍了所有
任务
成员(以及相关类型),讨论了在哪些情况下最适合使用哪些成员。有趣的是,
Task
constructor()或
Task.Start
()根本没有用例。总有更好的解决办法。

你的问题是什么?您已经发现了许多差异,注意到
Task.Run
适用于异步代码,而
Start
则不适用。@StephenCleary我更新了问题,使之更清楚。我可以看到差异,但我不知道它们有什么关系。“StartNew类似于task.Start的任务构造函数”-这是很好的信息。我读了
StartNew()
的所有缺点。