2015-04-17 47 views
99

我剛剛看到有關3 TPL用法在做同樣的工作關於Task.Start(),Task.Run()和Task.Factory.StartNew()

這裏例程代碼

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Create a task and supply a user delegate by using a lambda expression. 
    Task taskA = new Task(() => Console.WriteLine("Hello from taskA.")); 
    // Start the task. 
    taskA.Start(); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
        Thread.CurrentThread.Name); 
    taskA.Wait(); 
} 

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Define and run the task. 
    Task taskA = Task.Run(() => Console.WriteLine("Hello from taskA.")); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
         Thread.CurrentThread.Name); 
    taskA.Wait(); 
} 

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Better: Create and start the task in one operation. 
    Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA.")); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
        Thread.CurrentThread.Name); 

    taskA.Wait();     
} 
的使用

我只是不明白爲什麼MS給出了三種不同的方式在TPL運行的工作,因爲他們所有的工作一樣:Task.Start()Task.Run()Task.Factory.StartNew()

告訴我,是Task.Start(),Task.Run()Task.Factory.StartNew()都用於相同的目的或他們有不同的意義?

當一個應該使用Task.Start(),當Task.Run()和當一個應該使用Task.Factory.StartNew()

請幫助我瞭解他們的實際使用爲每個方案與實例非常詳細,謝謝。

+0

有一個[舊文章說明的是,這裏](http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx)和[這裏用於較新的'Task.Run '](http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx) - 也許這會回答你的問題;) – Carsten

+0

[Here](http://stackoverflow.com/a/21427264/1768303)是Task_Start實際上有用的例子。 – Noseratio

回答

108

Task.RunTask.Factory.StartNew特定安全參數的縮寫:它在.NET 4.5中添加

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

幫助的async日益頻繁的使用和卸載工作到ThreadPool

Task.Factory.StartNew(在.NET 4.0與TPL加入)是更加健壯。當你想使用​​您應該只使用它,如果Task.Run是不夠的,例如(雖然這是不必要的當代表是異步更多的是在我的博客:LongRunning Is Useless For Task.Run With async-await)。更多信息Task.Factory.StartNew in Task.Run vs Task.Factory.StartNew

永遠不要創建Task並致電Start(),除非您找到非常好的理由這樣做。只有當你有一些需要創建任務但不安排它們的部分時才應該使用它,另一部分則不需要創建即可安排。這幾乎從來都不是一個合適的解決方案,可能會很危險更多文章"Task.Factory.StartNew" vs "new Task(...).Start"

總之,大多數情況下使用Task.Run,如果您必須使用Task.Factory.StartNew並且從不使用Start

+2

你說:「永遠不要創建一個任務,並調用開始()」重定向到任何良好的寫作,這將顯示可能由Task.Start()引起的。我需要的細節,因爲你說避免它。感謝您的回覆。 – Mou

+0

@Mou我已經有... – i3arnon

+0

r你在談論這個鏈接http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx ?? – Mou

0

除了回答,你不應該在沒有一個令人信服的理由創建構造一個任務。 TPL在同步和併發性方面需要很多的關注。它將這些複雜性從客戶端代碼中隱藏起來。如果構建一個任務並啓動它,則需要考慮顯然難以處理的同步和併發性。

相關問題