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

1 に答える 1

0

「プロセスが一部のメンバーをスキップしているように見える」問題はどのように発生しますか?

出力に「Finished loop」と表示されたときにプロセスが完了したと考える場合、その理由は、タスクがまだ完了していない可能性があるためです。

"Finished loop" と書く前に、作成したタスクが完了するのを待ちます。

于 2013-11-09T05:44:28.887 に答える