私はこのタスクのためのよりよい解決策があるのだろうか。あるスレッドがある量のスレッドによって同時に呼び出される関数を持っていますが、あるスレッドがすでにコードを実行している場合、他のスレッドはコードのその部分をスキップし、そのスレッドが実行を終了するまで待つ必要があります。ここで私は今のところ持っているものです。"do or wait and skip"と並行して行うより良いアプローチ
int _flag = 0;
readonly ManualResetEventSlim Mre = new ManualResetEventSlim();
void Foo()
{
if (Interlocked.CompareExchange(ref _flag, 1, 0) == 0)
{
Mre.Reset();
try
{
// do stuff
}
finally
{
Mre.Set();
Interlocked.Exchange(ref _flag, 0);
}
}
else
{
Mre.Wait();
}
}
私が達成したいどのようなことは実行速度が速く、低オーバーヘッドときれいな外観です。
私は興味がありますが、方法の最後にWait()にどのようなシナリオがありますか?言い換えれば、そのスレッドはなぜ待ちますか? – brakeroo
メソッドは実際に何をしていますか? 'ActionBlock'を使って、実行のためにタイプTのメッセージを1つずつキューに入れることができます。または一度に1つの入力で動作し、後続のブロックに出力を送信する 'TransformBlock ' –
並行処理の問題を処理する最善の方法は、生のスレッドを完全に避けることです。 .NETには、ほとんどの同時シナリオを実装するクラスが含まれています。ほとんどの場合、既にBCL –