Task.Run和Task.Factory.StartNew有什么区别

时间:2016-11-15 11:25:49

标签: c# multithreading c#-4.0 task-parallel-library task

我之前已经问过这个问题,但是谷歌搜索后我没有得到正确答案。

我有这些代码行:

 assertionError: null == { [MongoError: Authentication failed.]
 name: 'MongoError',
 message: 'Authentication failed.',
 ok: 0,
 code: 18,

成功运行Task.Run(() => DoSomething()) .ContinueWith(t=>Log.Error(t,"Error"), TaskContinuationOptions.OnlyOnFaulted); Task.Factory.StartNew(() => DoSomething()) .ContinueWith(t=>Log.Error(t,"Error"),TaskContinuationOptions.OnlyOnFaulted); 后,DoSomething抛出Task.Run,而TaskCanceledException正常工作。为什么呢?

进一步阅读: Stephen Clearly on why not use Task.Factory.StartNew
MSDN Link

更新2: 示例代码:

Task.Factory.StartNew

1 个答案:

答案 0 :(得分:5)

  

Task.Run实际上是根据用于的相同逻辑实现的   Task.Factory.StartNew,只传入一些默认参数。什么时候   你将一个Action传递给Task.Run:

Task.Run(someAction);
  

这完全等同于:

Task.Factory.StartNew(someAction, 
    CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

了解更多here

如果您为CancellationToken.None参数传递TaskCreationOptions.DenyChildAttachTaskScheduler.DefaultTask.Factory.StartNew个参数,您应该会看到相同的结果。