私は自分がやっている仕事を少しチェックしていて、もう少し注目してみようと思いました。問題を引き起こしている本番環境のコードがあります。マルチスレッドを使用しており、私はその分野に比較的慣れていません。問題があったと思われるコードを取り出し、それをその核心まで切り分けようとし、自分の「モデル」をいじりました。これは私が思いついたものです。誰かが共有したいフィードバックをお寄せください。前もって感謝します。
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();
}