了解捕获异常并在多线程代码中执行延续

时间:2012-04-19 19:54:14

标签: c# multithreading .net-4.0 exception-handling task-parallel-library

我正在检查我正在做的一些工作,并且认为我会更多地关注它。我的生产代码给了我们麻烦。它使用多线程,我对那个区域相对较新。我接受了我认为麻烦的代码,并试图将其分解为核心,并且一直在摆弄我的“模型”。这就是我想出来的。我想要任何人关心分享的反馈。提前谢谢。

    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();
    }

1 个答案:

答案 0 :(得分:0)

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

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

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