2017-04-14 103 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)。