1

いくつかのコントロールの値をインクリメントするワーカー スレッドがあるとします。インボークが必要なため、すべてのインクリメントは GUI スレッドで行う必要があります。そのために、BeginInvoke を使用します。

私の質問は:

複数のワーカー スレッドがすべて同時に GUI スレッドで呼び出されるため (インクリメント自体someControl.Value += value;は明らかにアトミックではありません)、競合状態によってコントロールのインクリメントが中断される可能性はありますか?

または、逆に言えば:

別の Invoke が処理される前に、1 つの Invoke が終了することが保証されていますか?

delegate void valueDelegate(int value);

private void IncrementValue(int value)
{
   if (InvokeRequired)
   {
       BeginInvoke(new valueDelegate(IncrementValue),value);
   }
   else
   {
       someControl.Value += value;
   }
}

ありがとうございました!

4

1 に答える 1

5

いいえ、GUI スレッドは 1 つしかありません。そのため、呼び出されたデリゲートは効果的にキューに入れられ、順次実行されます。複数の GUI スレッドがある場合、実際にここで競合状態が発生しますが、私が認識しているすべての UI フレームワークで問題ありません。

于 2014-04-29T10:49:54.983 に答える