2016-11-15 6 views
4

Я знаю, что этот вопрос задан раньше, но я не получил правильного ответа после поиска в Google.В чем разница между Task.Run и Task.Factory.StartNew

У меня есть следующие строки кода:

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 в то время как Task.Factory.StartNew работает отлично. Зачем?

дальнейшее чтение: Stephen Clearly on why not use Task.Factory.StartNew
MSDN Link

UPDATE 2: Пример кода:

private async void button27_Click(object sender, EventArgs e) 
{ 
    var r = new Random(System.DateTime.Now.Millisecond); 

    await Task.Factory.StartNew(
     () => { 
      Divide(r.Next(100), r.Next(-1, 10)); 
      Log.Information("Divide Done!"); 
     }, 
     CancellationToken.None, 
     TaskCreationOptions.DenyChildAttach, 
     TaskScheduler.Default) 
    .ContinueWith(
     t => { 
      Log.Error(t.Exception,"There is an exception on Divide"); 
     }, 
     TaskContinuationOptions.OnlyOnFaulted); 
} 

private static void Divide(int a, int b) 
{ 
    var c = a/b; 
} 
+0

Возможный дубликат [Об использовании задач Task.Start(), Task.Run() и Task.Factory.StartNew()] (http://stackoverflow.com/questions/29693362/regarding-usage-of-task -start-task-run-and-task-factory-startnew) – smoksnes

+0

Нет, это не так. Это не отвечает на мой вопрос, почему возникает исключение throwing. Он описывает то, что я уже знаю. Благодарю. – Milad

+2

Я отбросил ваш вопрос, потому что вы полностью изменили его, аннулировав существующие ответы. Если у вас есть новый вопрос, напишите новый вопрос. – svick

ответ

4

Task.Run фактически реализуется в терминах той же логики, используемой для задачи .Factory.StartNew, просто передавая некоторые параметры по умолчанию. Когда вы передаете Действие на 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 параметров, вы должны увидеть тот же результат.

+0

Да, я знаю. Я обновил вопрос. Благодарю. – Milad

+2

@ Sepinood: Может быть, это http://stackoverflow.com/questions/26577519/why-is-taskcanceledexception-thrown-and-does-not-always-breaks-into-the-debugger или http://stackoverflow.com/questions/27196451/when-do-task-runaction-cancelationtoken-throw-taskcanceledexception – CharithJ

+0

Спасибо, это помогло мне. Я полностью обновил этот вопрос. Я думаю, что это связано с дизайном TPL. – Milad

 Смежные вопросы

  • Нет связанных вопросов^_^