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();
}
お困りですか? ( '私たちに問題を起こしている生産のコード') – sll
何が問題なのですか? – svick
プロセスはfooによって表されるグループの一部のメンバーをスキップしているようです。問題の一部は、try/catchがもともとforeachループを囲んでいたということでした。 foreachループ内で例外が発生すると、ループ全体が終了します。タスクの継続はここに示したStartNewのように思っていましたが、TryNatchにtry/catchがどのように配置されているかによって例外があった場合に呼び出されているとは思いません。ほとんどの場合、ここにあるものがエラーを捕捉して継続コードを実行する適切な方法であるかどうかを知りたい。 – BobC