0

我正在檢查我正在做的一些工作,並認爲我會多看一些。我有生產中的代碼給我們帶來麻煩。它使用多線程,我相對較新的,即區域。我認爲我認爲是麻煩的代碼,並試圖將其隔離爲核心,並一直在擺弄我的「模型」。這是我想出來的。我想要任何人都在意的分享。提前致謝。理解捕獲異常並在多線程代碼中執行延續

static void Main(string[] args) 
    { 
     var semaphoreSlim = new SemaphoreSlim(3); 

     Console.WriteLine("Starting loop"); 

     var foo = new[] {1, 2, 3, 4, 5, 6}; 

     foreach (var i in foo) 
     { 
      Console.WriteLine("Queueing task {0}", i); 

      var j = i; 
      var sl = i*1000; 

      var task = Task.Factory.StartNew(() => 
      { 
       semaphoreSlim.Wait(); 

       try 
       { 
        Console.WriteLine("Task {0} started - sleep {1} ms", j, sl); 
        Thread.Sleep(sl); 
        if (j == 2 || j == 5) throw new Exception("error"); 
        Console.WriteLine("Task {0} done", j); 
       } 
       catch (Exception) 
       { 
        Console.WriteLine("Caught exception {0}", j); 
        throw; 
       } 
       finally 
       { 
        semaphoreSlim.Release(); 
       } 
      }); 

      task.ContinueWith(x => Console.WriteLine("Continuation: Completed {0}", j), 
             TaskContinuationOptions.OnlyOnRanToCompletion); 

      task.ContinueWith(x => Console.WriteLine("Continuation: Faulted {0}", j), 
             TaskContinuationOptions.OnlyOnFaulted); 
     } 

     Console.WriteLine("Finished loop"); 

     Console.ReadLine(); 
    } 
+2

哪個麻煩你的意思是? ('生產中的代碼給我們帶來麻煩') – sll 2012-04-19 19:59:21

+1

問題是什麼? – svick 2012-04-19 20:09:28

+0

這個過程似乎在跳過由foo代表的小組的一些成員。我認爲問題的一部分是try/catch最初包含了foreach循環。 foreach循環內的任何異常都會殺死整個循環。任務延續如這裏所示的StartNew,我認爲是你期望的,但是我不認爲如果由於try/catch的位置而導致Star​​tNew出現異常,他們會被調用。大多數情況下,我想知道我在這裏是否是捕捉錯誤並執行延續代碼的正確方法。 – BobC 2012-04-19 20:10:11

回答

0

「過程似乎跳過一些成員」的問題如何顯示?

如果您在輸出中看到「完成循環」時認爲過程完成,原因是您的任務可能尚未完成。

在寫完「完成的循環」之前等待創建的任務完成。