投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/2/21 05:47:06
BackgroundWorker を使う際の基本は――

開始パラメータは、
  メインスレッド:RunWorkerAsyncの引数で渡す
  ワーカースレッド:DoWork 内で e.Argument で受け取る
途中経過報告は、
  ワーカースレッド:DoWork 内で ReportProgress で通知する
  メインスレッド:ProgressChanged で受信し、画面等に表示
途中キャンセル要求は、
  メインスレッド:CancelAsync メソッドで中止依頼を行う
  ワーカースレッド:DoWork 内で CancellationPending の状態を見て処理を打ち切る
処理結果は、
  ワーカースレッド:DoWork 内で e.Result で渡す
  メインスレッド:RunWorkerCompleted 内で e.Result で受け取る

――という流れになります。
DoWork 内では、フォーム上のコントロールやフィールド変数を読み書きしないようにしてください。

「BackgroundWorker に処理を依頼したら、後は終わるまで放置」が原則です。

許されるのは、ReportProgress や CancelAsync によるやりとりだけであり、DoWork 内では、
「イベント引数」と「イベント内のローカル変数」以外の変数は、原則として使用禁止と思ってください。

当然、「Private strComboItem as string」も使えません。
DoWork 中は絶対に書き換えないという事が保証できるなら、読取専用として利用できなくも無いですが、
それならば RunWorkerAsync の引数で十分であるため、実質的には使えない事になります。


どうしても、非同期処理中にメインスレッドとのやり取りが必要となる場合には、
変数の変更と読込が同時に発生してしまわないようにするために、Invoke メソッドで処理を依頼するか、
あるいは、何かしらの同期/ロック機構を用意する必要があるでしょう。


> if check1.checked then は、_DoWork内で答えてくれるのに
本来はそれも NG です。
コントロールは、メインスレッド(UIスレッド)からのみ操作が許可されています。