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

“过程似乎跳过一些成员”的问题如何显示?

如果您在输出中看到“完成循环”时认为过程完成,原因是您的任务可能尚未完成。

在写完“完成的循环”之前等待创建的任务完成。