C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: backgroundWokerが起動しない??


(過去ログ 105 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■62479 / inTopicNo.1)  backgroundWokerが起動しない??
  
□投稿者/ ポコニャン! (1回)-(2011/10/13(Thu) 21:40:56)

分類:[C#] 

重たい処理をバックグラウンドで動かそうと考えていろんな文献を見て、同じように作って見ましたが動いてくれません。
ステップ実行にてデバッグしてみたのですが、どうしてもバックグラウンドの処理に入ってくれず困っております。
しかも、ビルド時などにもまったくエラーが出てくれないためどう対処したらいいのか・・・どなたか教えていただけませんでしょうか。

<抜粋>
public Form1()
{
InitializeComponent();
}

 private void button1_Click(object sender, EventArgs e)
        {
             button1.Enabled = false;
             backgroundWorker1.RunWorkerAsync();
         }

 private void backgroundWorker1_Dowork(object sender, EventArgs e)
 {            
            if (Directory.Exists(textBox1.Text))
            {
                XXX();                
            }
・
・
・
・
・

引用返信 編集キー/
■62481 / inTopicNo.2)  Re[1]: backgroundWokerが起動しない??
□投稿者/ 魔界の仮面弁士 (2390回)-(2011/10/13(Thu) 22:06:12)
No62479 (ポコニャン! さん) に返信
>  private void backgroundWorker1_Dowork(object sender, EventArgs e)
>  {            
>      if (Directory.Exists(textBox1.Text))
こういった操作は NG です。DoWork 内からコントロールを読み書きしてはいけません。


> 重たい処理をバックグラウンドで動かそうと考えていろんな文献を見て、同じように作って見ましたが動いてくれません。
同じであれば動くはずですよ。元のコードに不具合が無い限りは。
それが動かないという事は、同じようには作られていない、という事なのだと思います。


> しかも、ビルド時などにもまったくエラーが出てくれないためどう対処したらいいのか・・・
ビルドエラーが出ないなら、文法的には正しいということなのでしょう。

で、実行時エラーに関してですが、DoWork 内でエラーが発生した場合、
その例外を catch していない限り、DoWork の実行はその段階で中断されます。
そして、そのまま RunWorkerCompleted イベントが通知され、
その引数 e.Error プロパティに対して、発生した例外が渡されてきます。


> どなたか教えていただけませんでしょうか。
以下、参考になるかどうかはわかりませんが。

[マルチスレッド アプリケーションのデバッグ]
http://msdn.microsoft.com/ja-jp/library/ms164746.aspx

引用返信 編集キー/
■62482 / inTopicNo.3)  Re[1]: backgroundWokerが起動しない??
□投稿者/ Azulean (856回)-(2011/10/13(Thu) 22:08:10)
可能性1:イベントを割り当てていない
単に backgroundWorker1 の DoWork イベントに backgroundWorker1_DoWork イベントハンドラを結びつけていないだけでは?

backgroundWorker1_DoWork をコードで書くだけでは、backgroundWorker1 から参照されません。
イベントの設定の仕方を確認してください。


可能性2:バックグラウンドスレッドでコントロールを参照して InvalidOperationException が発生していることに気づいていない
コントロールを作ったスレッド以外からコントロールを参照することはできません。
バックグラウンドスレッドで textBox1.Text を参照すると InvalidOperationException という例外が発生し、バックグラウンドスレッドは終了します。
この場合、終了イベントの e.Error で例外が通知されていますので、何も起きていないように見えるかもしれません。
メインスレッドでコントロールを参照して、RunWorkerAsync の引数に文字列を渡すようにしましょう。
引用返信 編集キー/
■62485 / inTopicNo.4)  Re[2]: backgroundWokerが起動しない??
□投稿者/ ポコニャン! (4回)-(2011/10/13(Thu) 22:42:40)
魔界の仮面弁士様 ありがとうございます。

>こういった操作は NG です。DoWork 内からコントロールを読み書きしてはいけません。
ということはコントロールを使ったものはバックグラウンド処理にせず結局重いまま実行させるということしか対処できなのですね・・・

>同じであれば動くはずですよ。元のコードに不具合が無い限りは
ただのコピペで動かなくて・・・ダウンロードしてきたプログラムは動いたのでたしかにおっしゃるとおりかもです。(@ITのコラム)


Azulean 様ありがとうございます。

>backgroundWorker1_DoWork をコードで書くだけでは、backgroundWorker1 から参照されません。
>イベントの設定の仕方を確認してください。

イベント設定の仕方とはどのようなことでしょうか?
(すいません。。。なんのことかわからないものでして・・・)

引用返信 編集キー/
■62486 / inTopicNo.5)  Re[3]: backgroundWokerが起動しない??
□投稿者/ Azulean (858回)-(2011/10/14(Fri) 00:47:31)
No62485 (ポコニャン! さん) に返信
> イベント設定の仕方とはどのようなことでしょうか?
> (すいません。。。なんのことかわからないものでして・・・)

入門書などを読み直しましょう。
+= と書くとか、プロパティペインのイベントのところから割り当てるとか。
引用返信 編集キー/
■62489 / inTopicNo.6)  Re[3]: backgroundWokerが起動しない??
□投稿者/ ゼロワン (9回)-(2011/10/14(Fri) 13:20:19)
No62485 (ポコニャン! さん) に返信

> >こういった操作は NG です。DoWork 内からコントロールを読み書きしてはいけません。
> ということはコントロールを使ったものはバックグラウンド処理にせず結局重いまま実行させるということしか対処できなのですね・・・

backgroundWorkerには、RunWorkerAsyncメソッドの引数にDoWorkイベントで使用するパラメータを渡すことができます。
ただし、このパラメータを参照したい場合、DoWorkのイベント引数の型はEventArgsではなく、
System.ComponentModel.DoWorkEventArgsを使ってください。

今回の例の場合、textBox1.Textの内容を渡したい場合は、その内容をRunWorkerAsyncメソッドの引数に渡してあげればいいでしょう。
渡したいパラメータが複数ある場合は、複数パラメータを設定できるクラスのようなものを作り、
そこに値を入れて渡すという方法もあります。

概要だけ触れましたが、ご自分のものにするためにも、もう少し、backgroundWorkerおよび上出のキーワードを調べてみることをお勧めします。

また、DoWorkイベントで処理した結果の値をメインスレッドに渡すこともできますが、提示サンプルにはRunWorkerCompletedイベントについて
記載されていませんので、必要であればこのキーワードで調べてみてください。

> >backgroundWorker1_DoWork をコードで書くだけでは、backgroundWorker1 から参照されません。
> >イベントの設定の仕方を確認してください。
> イベント設定の仕方とはどのようなことでしょうか?
> (すいません。。。なんのことかわからないものでして・・・)

イベントの設定は、基本中の基本です。
それでは、button1_Clickのイベントはどのようにして設定しましたか?
引用返信 編集キー/
■62586 / inTopicNo.7)  Re[4]: backgroundWokerが起動しない??
□投稿者/ ポコニャン! (5回)-(2011/10/19(Wed) 22:29:34)
ありがとうございました。
みなさんのお陰で直すことが出来ました。
原因は、そもそもイベントを設定していなかったことがあります。
大変助かりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -