2011-11-23 69 views
1

我有一個測試使用.NET任務並行庫:TPL - 設置任務到了Thread.sleep很長一段時間

static void Main(string[] args) 
{ 
    for(int i = 0; i < 1000; i++) 
    { 
     int n = i; 
     Task.Factory.StartNew(() => TaskTest(n)); 
    } 
} 

static void TaskTest(int i) 
{ 
    // Will sleep for a long time 
    Thread.Sleep(TimeSpan.FromMinutes(i)); 
    // Do something here 
} 

有一兩件事我不知道:當了Thread.Sleep在上面的代碼執行,會發生什麼?我知道它不會佔用ThreadPool中的線程,如果我將多個任務設置爲Thread.Sleep很長時間,例如24小時,是否有任何缺點?

回答

2

這將佔用ThreadPool中的一個線程。嘗試運行代碼,你會發現整個線程池被等待的任務佔用。使用方法:

 List<Task> tasks = new List<Task>(); 

     for (int i = 0; i < 1000; i++) 
     { 
      int n = i; 
      tasks.Add(Task.Factory.StartNew(() => TaskTest(n))); 
     } 

     Task.WaitAll(tasks.ToArray()); 

的ParallelExtensionsExtras項目包含一個擴展方法TaskFactory稱爲StartNewDelayed,您可以在其中計劃任務。請參閱:http://geekswithblogs.net/JoshReuben/archive/2010/11/14/parallel-extensions-extras.aspx

+0

我嘗試運行您的代碼,但未找到任何等待的任務,它在我的計算機上運行良好。 – superche