2008年06月16日

BackGroundWorkerでのバックグラウンド処理(つまづき→解決 編)

「BackGroundWorkerでのバックグラウンド処理(つまづき編)」では、DoWorkイベントに親スレッドのコントロール操作を記述していると、InvalidOperationExceptionエラーが発生するということを掲載しました。

ProgressChangedイベントRunWorkerCompletedイベントを使って、コントロールにアクセスする方法も掲載しました。

でも、できるだけ自由にアクセスする方法はないものか、自分なりに調べてみました。
一応「解決編」としていますが、根本部分まで理解できたかどうかは。。。。

ただ、できるだけ自由にアクセスする方法は、他には見つからなかったもので。

その方法と言うのは、デリゲート(Delegate)InVokeを使用する方法です。

プログラミングのプロの方には、当然だと思われるでしょうが、初心者にはかなり敷居が高いです。。。。

>>>


>>>

まず、何故別スレッドからアクセスすることが出来ないのか、自分なりに調べた結果は以下の通り。

・別スレッドから、メインのコントロールにアクセスすると、
面倒なことが発生する可能性が有る。
 メインのフォームの設定と矛盾した設定をしてしまう可能性がある。
・フォーム上のコントロールのメソッドなどは、一般的には別スレッドから安全に呼び出すことが保証されていない。

あまり詳しくはないんですけど。。。。

で、安全に呼び出すために用意されているのが、各コントロールのInVokeメソッドです。
Invokeメソッドを経由してメソッドを呼び出すと、必ずコントロールを作成したメインのスレッドから呼び出しが行われるということです。

そこで、この様な処理を行う必要がある場合は、以下のような手順が必要となります。

1:各コントロールに対する操作メソッドを作成する。

2:Delegate宣言を行う。
  
3:Delegateを型とした変数を宣言する。
 Newキーワードを付け、コンストラクタの引数に"AddressOf デリゲートするメソッド名"を引数に指定する。
 →宣言のときにNewキーワードをつけない場合、適切な箇所でインスタンスを生成する必要がある。

4:フォームコントロールのInvokeメソッドを利用してデリゲートしたメソッドを実行する。
 Invokeメソッドの引数は、以下の通り。
 第1引数 … デリゲートしたメソッド
 第2引数 … デリゲートしたメソッドの引数

※VB2005以降は、この方法でコントロールを操作しないとエラーが発生します。
※デリゲートは、メソッド数分必要です。




初心者を対象としたVB2005の書籍で、「BackgroundWorkerを使えば簡単にスレッド処理が出来る」と言う記述を良く見かけます。

デリゲート、InVokeなんかは、初心者では思いつきませんって。

実際にコーディングしてみた例は、次回に掲載させていただきます。



posted by Debring at 10:30 | Comment(0) | TrackBack(0) | VB2005 スレッド処理
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。