2010-10-29 87 views
4

試圖掌握TPL。任務忽略Thread.Sleep

只是爲了好玩,我試着用隨機睡眠來創建一些任務,看看它是如何處理的。我是針對火災和忘記模式..

static void Main(string[] args) 
    { 
     Console.WriteLine("Demonstrating a successful transaction"); 

     Random d = new Random(); 
     for (int i = 0; i < 10; i++) 
     { 
      var sleep = d.Next(100, 2000); 


      Action<int> succes = (int x) => 
      { 
       Thread.Sleep(x); 
       Console.WriteLine("sleep={2}, Task={0}, Thread={1}: Begin successful transaction", 
        Task.CurrentId, Thread.CurrentThread.ManagedThreadId, x); 
      }; 

      Task t1 = Task.Factory.StartNew(() => succes(sleep)); 
     } 
     Console.ReadLine(); 
    } 

但我不明白爲什麼它輸出忽略了睡眠(隨機)

有人可以解釋給我的所有行到控制檯?

回答

2

您的代碼使用值i而不是生成的隨機數。它不會忽略睡眠,而是每次迭代都會在0到10ms之間睡眠。

嘗試:

Thread.Sleep(sleep); 
+0

只是一個錯字,編輯了原來的代碼。問題仍然是一樣的! – Janus007 2010-10-29 13:16:04

0

句子

任務T1 = Task.Factory.StartNew(()=>更迭(睡眠));

將創建任務並自動啓動它,然後將在for內部再次迭代,而無需等待任務結束其進程。所以當第二個任務被創建並執行時,第一個任務可能會被完成。我的意思是你是不是等待任務結束:

你應該嘗試

Task t1 = Task.Factory.StartNew(() => succes(sleep)); 
t1.Wait(); 
6

重要:

的TPL默認的TaskScheduler並不能保證每個任務線程 - 一個線程可用於處理幾個任務。

調用Thread.Sleep可能會影響其他任務的性能。

您可以構建與TaskCreationOptions.LongRunning提示你的任務這種方式的TaskScheduler將指派該任務的專用線,這將是安全的,就可以阻止。