2017-04-14 111 views
0

我試圖在同一時間運行多個任務

private static void Main(string[] args) 
    { 
     while (true) { 
      Console.ForegroundColor = ConsoleColor.White; 
      Console.Write("Enter number of cart: "); 
      var numOfCarts = Convert.ToInt32(Console.ReadLine()); 

      Console.Write("Enter number of items: "); 
      var numOfItems = Convert.ToInt32(Console.ReadLine()); 
      RunTasks(numOfCarts, numOfItems).Wait(); 
     } 
    } 

    public static async Task RunTasks(int numOfCarts, int numOfItems) 
    { 
     for (var i = 0; i < numOfCarts; i++) 
      await Task.Run(() => 
      { 
       var color = (ConsoleColor) new Random().Next(0, 15); 
       for (var q = 0; q < numOfItems; q++) { 
        Console.ForegroundColor = color; 
        Console.WriteLine("Cart {0} : {1}", i, q); 
       } 
      }); 
    } 

這是正確的實施,執行多個任務? ForegroundColor很少改變。我希望每個購物車的控制檯顏色不同。

+0

這與ASP.NET有什麼關係? –

回答

1

不要混淆Task.Wait()調用和async/await。在你的情況下,當主線程等待RunTasks執行而RunTasks等待主線程啓動時,可能導致死鎖延續。

在你的情況,你可以簡單地使用Task.WhenAll

private static void Main(string[] args) 
{ 
    while (true) { 
     Console.ForegroundColor = ConsoleColor.White; 
     Console.Write("Enter number of cart: "); 
     var numOfCarts = Convert.ToInt32(Console.ReadLine()); 

     Console.Write("Enter number of items: "); 
     var numOfItems = Convert.ToInt32(Console.ReadLine()); 
     RunTasks(numOfCarts, numOfItems).Wait(); 
    } 
} 

public static Task RunTasks(int numOfCarts, int numOfItems) 
{ 
    Task[] tasks = new Task[numOfCarts]; 
    for (var i = 0; i < numOfCarts; i++) 
    { 
     tasks[i] = Task.Run(() => 
     { 
      var color = (ConsoleColor) new Random().Next(0, 15); 
      for (var q = 0; q < numOfItems; q++) { 
       Console.ForegroundColor = color; 
       Console.WriteLine("Cart {0} : {1}", i, q); 
      } 
     }); 
    } 

    return Task.WhenAll(tasks); 
}  
  • RunTasks啓動了許多Task S和返回任務時,所有的子任務完成後,將完成。
  • Main將開始RunTasks並阻止主線程,直到RunTasks完成。

與此同時,你可以在RunTasksawait Task.WhenAll,然後在Mainawait RunTasks(),但它並沒有多大意義 - 你的主線程總是很忙,會無限做一個工作(這是RunTasks)。