2017-10-04 60 views
-2

是否有可能做使用新的異步/等待下面的函數功能在C#:轉換使用線程使用異步/等待

static void Main(string[] args) 
{ 
    Thread[] thread = new Thread[101]; 

    for (int i = 0; i < 101; i++) 
    { 
     thread[i] = new Thread(IntenseWork); 
     thread[i].Start(); 
    } 

    Finish(thread); 
} 

private static void IntenseWork() 
{ 
    Thread.Sleep(5000); 
} 

private static void Finish(Thread[] threadArray) 
{ 
    foreach (Thread ta in threadArray) 
    { 
     ta.Join(); 
    } 

    Console.WriteLine("Press Any Key to Continue..."); 
    Console.ReadKey(); 
} 

我知道有異步的侷限性/恭候您只能使用線程。但是對於像這樣的例子,其中有一個功能DoWork需要同時在多個線程上運行,可以這樣做嗎?

+1

創建'Task'收集和使用'Task.WhenAll' – Nkosi

+0

@Nkosi你能不能給我,我該怎麼辦,一個小樣本? –

+2

有人已經提供了答案。您還應該花些時間閱讀本文參考資料[異步/等待 - 異步編程最佳實踐](https://msdn.microsoft.com/zh-cn/magazine/jj991977.aspx) – Nkosi

回答

-1

這個?

static void Main(string[] args) 
    { 
     Task[] tasks = new Task[101]; 

     for (int i = 0; i < tasks.Length; i++) 
     { 
      tasks[i] = IntenseWork(); 
     } 
     Task.WaitAll(tasks); 
     Console.WriteLine("Press Any Key to Continue..."); 
     Console.ReadKey(); 
    } 

    private static async Task IntenseWork() 
    { 
     await Task.Delay(5000); 
    } 
+0

我看到所以我正在處理任務而不是線程,然後可以調用Task.WaitAll而不是執行Thread.Join。這是唯一的區別? –

+1

@BlakeRivell「只有」和冰山一樣大。 –

+0

@PanagiotisKanavos我得到了你,但我的意思就像我的榜樣一樣。 –