我之前已经问过这个问题,但是谷歌搜索后我没有得到正确答案。
我有这些代码行:
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
答案 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.DenyChildAttach
,TaskScheduler.Default
和Task.Factory.StartNew
个参数,您应该会看到相同的结果。