2011-07-18 5 views
3

BackgroundWorkerは以前使用していたものと少し違っています。DoWorkでのバックグラウンドワーカー変数の割り当て

通常、一部のグラフィカルコントロールを更新するためにBWを使用し、DoWorkメソッドで必要なすべてのタスクを実行し、結果を返して、RunWorkerCompletedイベントハンドラへの割り当てを行います。

ここでは、私はちょうど計算(DBクエリ)の結果を現在のウィンドウのいくつかのプライベート変数_myListに割り当てたいと思っていました。

私はDoWorkメソッドからリストを割り当てることが許可されていることを知り、非常に驚​​いていました。

これは正常だったのか、それとも何らかの理由で推薦されなかったのかを知りたいだけでしたか?

答えて

4

変数に代入することは許可されます。これは、スレッド間のアクションに対して守るためのチェックがないため、これらのチェックを行うのはUI要素だけです。

推奨される場合は、マルチスレッド同期の領域に入っています。

通常あなたは競合状態のようなものを防ぐために、それを使用しようとする前に、リソースへのアクセスをロック:

static object Locker = new object(); 

lock (Locker) 
{ 
    // variable assignment in here. 
} 

ご利用が基本であるならば、あなたはの終わりに、それにセットのようにあなたがそれから読んだバックグラウンドワーカーのチャンクは、あなたがこれをするのが安全です。しかし、他のスタッフがそれに書き込もうとすると、あるいはあなたがそれを実行する前に変数の内容をチェックするコードを持っていれば、競合状態に陥ります。

1

これは正常で正常です。あなたは、それらを作成したスレッドとは異なるスレッドからコントロールにアクセスすることは許されていません。他のすべての変数については、そのような制限はありません。
しかし、スレッドに関する他の問題に注意する必要があります。同じ変数にアクセスする2つのスレッドがある場合、アクセスが同期していないと問題が発生する可能性があります。

0

このプロセスが実行されている間にユーザーがUIを引き続き使用できると判断した場合、「オフライン」のデータを同期することは問題ありません。

私はこれを多くしました。特にモバイルアプリケーションを開発する場合

2

これは、変数がUIコントロールのようなCrossThreadingに対して保護されていないためです。

2つの別々のスレッドが同じオブジェクトにアクセスしないように注意する必要があります。特に、リストやディクショナリなどのより複雑なデータ構造の場合、非常に奇妙な結果や例外が発生する可能性があります。

オブジェクトへのアクセスを同期させるには、必要に応じてlockステートメントを使用します。

int型、uint型などの値の型は理論上は問題ありません。 MSDNの

Thisページは、スレッドの開始点として役立ちます。

3

バックグラウンドワーカーDoWorkイベントから(UIコントロールだけでなく)どんな種類の変数にもアクセスしないようにします。それはほとんどの時間で動作するように見えるかもしれませんが、それは100%の証明ではありません。変数が静的であれば、変数にアクセスすることに問題はありません。

従業員が作業する必要がある変数が2つ以上ある場合、小さなクラスまたは構造体を作成してすべての変数を保持し、その変数をDoWorkイベントに渡してeの更新値を返します。バックグラウンドワーカーの結果。 WorkerCompletedイベントでは、それに応じてローカル変数を更新できます

関連する問題