2014-01-29 72 views
0

我想問一下今天方法的線程在C#中。我知道有相當新的詞,如asyncawait可以幫助處理線程。那麼像這樣的事情:現代方法的線程在C#中

Task firstTask = new Task(() => 
{ 
    //some action 
}); 
firstTask.Start(); 

我應該如何使用Task?我是否需要定義async方法並在其中使用上面的方法?我可以在裏面寫await而不是firstTask.wait()嗎?

我需要合併使用兩個線程現在兩個集合。做上面提到的事情是否是好方法?

+0

爲了處理集合,你應該看一看PLINQ =) – rla4

+0

'等待Task.Factory.StartNew(()=> yourFuncHere()) ;'在異步函數 –

+0

使用兩個線程合併兩個集合?狡猾,你只需要一個線程來做到這一點... –

回答

4

起初Task並不完全等於線程

Task是某種工作項目,可以異步完成,必須等待或取消的能力。它重要的是要明白,TaskScheduler decides是否應該創建新線程的下一個任務,要等到某個線程變得池或在當前線程

在對面自由奔跑,你可以使用ThreadThreadPool如果手動你想確保物理線程將被創建或從池中

async/await採取的無非是一個語法糖多轉轉Tasks

所以

Thread/Threadpool被用於處理物理線程底層類

Task s爲更高級的庫,即治療異步opperation作爲工作的獨立部分,這需要單獨做

async/await是語法糖,使一些常見任務更容易

0

注重枚舉集合。他們必須是不變的,這意味着你不能修改它們當一個線程處於foreach,或者線程(一個枚舉,而不是一個修改集合)將拋出InvalidOperationException。這是非常難以調試的。

lock (coll) 
{ 
    foreach (var item in coll) 
    { 
     // ... 
    } 
} 

也鎖邊修改:

lock (coll) 
{ 
    coll.Add(item); 
} 
2

總之Task是圍繞異步執行的工作的抽象。現在使用任務是一種推薦的方法。

有時TaskThreadPool分配相應的背景Thread(例如,當您運行使用Task.Run(() => {Calculate});一些計算,有時它使用的系統功能做我異步/O operartions沒有消耗額外的線程上ThreadPool(例如,當你閱讀與FileStream.ReadAsyncMethod

文件有太多的問你的問題,我建議你去文檔第一: