2011-06-24 6 views
9

UIスレッドにメソッドを呼び出すと、スレッドはWindowsメッセージキューによって検索され、その後リエントラントである必要はありませんか?UIスレッドでマーシャリングされたメソッドはスレッドセーフである必要があります

private void CalledFromWorkerThread() 
    { 
     //changed from 'InvokeRequired' Anti-Pattern 
     this.Invoke((Action) (() => _counter++; /* Is this ok? */)); 
    } 

明確化:_counterにアクセスするUIスレッドのみです。

+0

まだカウンターをロックしていない場合は、カウンターを使用する必要があります。 –

+1

こちらもご覧ください:http://www.yoda.arachsys.com/csharp/threads/winforms.shtml –

+3

「InvokeRequired」のテストは反パターンです。 'Control.Invoke'はすでにこのようなチェックを含んでいます。 –

答えて

9

_counterはUIスレッドによってのみアクセスされるものとします。

2つのスレッドがCalledFromWorkerThreadを呼び出す場合、_counterは適切にインクリメントされ、スレッドセーフです。

2

これは、同じスレッドからの呼び出しを委譲しますが、必ずしもその関数内で行うすべてのことがスレッドセーフであるとは限りません。

+0

これがそのフィールドを変更する唯一のコードだとします。スレッドセーフですか? –

+0

それにアクセスする唯一のスレッドです(スレッドセーフである必要はありません)。そう、はい、それは安全です。 – ghimireniraj

4

説明に基づいて、UIスレッドのみが_counterにアクセスしているため、ロックは必要ありません。私は私の例を更新しました。私は必要なチェックを呼び出す場合に余分なことを避けるために、この方法でコーディングする方が好きです。

private void CalledFromWorkerThred() 
{ 
    this.Invoke((Action) (() => _counter++;)); 
} 
+0

+1質問を更新しました。乾杯、耳。 –

関連する問題