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

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

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

Re[6]: BackgroundWorkerが再利用できない


(過去ログ 34 を表示中)

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

■16730 / inTopicNo.1)  BackgroundWorkerが再利用できない
  
□投稿者/ K (1回)-(2008/04/10(Thu) 01:17:10)

分類:[.NET 全般] 

Windows XP SP2, Visual Studio 2008, C#

BackgroundWorkerの処理中に、メインスレッドでBusyならキャンセルして終了を待つという処理を入れました。
しかし、バッググラウンド処理はとっくに終了しているにもかかわらず、IsBusyプロパティがいつまでたってもtrueのままです。

BackgroundWorkerの処理終了後にIsBusyを見ると、ちゃんとfalseになっているのですが。
BackgroundWorkerの終了待ちというのはできないのでしょうか?

// メインスレッドでの待ちコード
if (this.backgroundWorker1.IsBusy)
{
this.backgroundWorker1.CancelAsync();
while (this.backgroundWorker1.IsBusy) // いつまでたってもtrueのまま
{
System.Threading.Thread.Sleep(100);
}
}

引用返信 編集キー/
■16733 / inTopicNo.2)  Re[1]: BackgroundWorkerが再利用できない
□投稿者/ 魔界の仮面弁士 (689回)-(2008/04/10(Thu) 02:08:22)
No16730 (K さん) に返信
> while (this.backgroundWorker1.IsBusy)

キャンセル処理と言えども、メインスレッドをループ待機させてしまっては、BackgroundWorker の意味が無いかと…。

> // いつまでたってもtrueのまま

Application.DoEvents() を挟む事で、IsBusy プロパティ値の変更が届くかと思いますが、
問題を複雑にしてしまう事もありますので、個人的にはあまりおすすめできません。

ループで待機させたりはせず、RunWorkerCompleted イベントを使うようにすべきかと。
引用返信 編集キー/
■16809 / inTopicNo.3)  Re[2]: BackgroundWorkerが再利用できない
□投稿者/ K (2回)-(2008/04/10(Thu) 21:17:23)
回答ありがとうございます。

> キャンセル処理と言えども、メインスレッドをループ待機させてしまっては、BackgroundWorker の意味が無いかと…。
新しいバッググラウンド処理を開始する際、前の処理が実行中だったらキャンセルする、という仕様なのです。

前のBackgroundWorkerはキャンセルしてRunWorkerCompletedで処理し、
新しい処理は別のBackgroundWorkerで実行した方がスマートなのでしょうか?

> Application.DoEvents() を挟む事で、IsBusy プロパティ値の変更が届くかと思いますが、
メインスレッドでRunWorkerCompleted の呼ばれる前にIsBusy がfalseになるみたいですね。
いつまで待ってもIsBusy が変更されないわけです。
引用返信 編集キー/
■16810 / inTopicNo.4)  Re[3]: BackgroundWorkerが再利用できない
□投稿者/ 渋木宏明(ひどり) (699回)-(2008/04/10(Thu) 21:33:33)
渋木宏明(ひどり) さんの Web サイト
> 前のBackgroundWorkerはキャンセルしてRunWorkerCompletedで処理し、
> 新しい処理は別のBackgroundWorkerで実行した方がスマートなのでしょうか?

です。圧倒的に。
引用返信 編集キー/
■16813 / inTopicNo.5)  Re[4]: BackgroundWorkerが再利用できない
□投稿者/ K (3回)-(2008/04/10(Thu) 23:00:15)
>>前のBackgroundWorkerはキャンセルしてRunWorkerCompletedで処理し、
>>新しい処理は別のBackgroundWorkerで実行した方がスマートなのでしょうか?
>
> です。圧倒的に。
むむ、そうですか。

BackgroundWorkerはDispose()メソッドを実装しているようです。
RunWorkerCompleted でDispose()しちゃっていいんでしょうか?
引用返信 編集キー/
■16816 / inTopicNo.6)  Re[5]: BackgroundWorkerが再利用できない
□投稿者/ Azulean (64回)-(2008/04/10(Thu) 23:12:13)
> BackgroundWorkerはDispose()メソッドを実装しているようです。
> RunWorkerCompleted でDispose()しちゃっていいんでしょうか?
デザイナで貼り付けたものを勝手にDisposeしてはいけません。

余談ですが、RunWorkerCompletedイベントハンドラの中でRunWorkerAsyncとかしようとしてもエラーになります。
引用返信 編集キー/
■16821 / inTopicNo.7)  Re[5]: BackgroundWorkerが再利用できない
□投稿者/ 渋木宏明(ひどり) (700回)-(2008/04/11(Fri) 00:37:28)
渋木宏明(ひどり) さんの Web サイト
> >>新しい処理は別のBackgroundWorkerで実行した方がスマートなのでしょうか?
>>
>>です。圧倒的に。
> むむ、そうですか。

ごめんなさい、反射的に書いてしまった。

「新しい BackgroundWorker で実行」する必要はないですね。
使い回しでいいでしょう。

でも

>余談ですが、RunWorkerCompletedイベントハンドラの中でRunWorkerAsyncとかしようとしてもエラーになります。

なんてとこを真面目に回避しようとするとかなり煩雑なコードになってしまうね。

いっそ非同期メソッドにして、後始末だけはしっかりやるようにするってのも手かな。

引用返信 編集キー/
■16862 / inTopicNo.8)  Re[6]: BackgroundWorkerが再利用できない
□投稿者/ K (4回)-(2008/04/11(Fri) 23:30:42)
>余談ですが、RunWorkerCompletedイベントハンドラの中でRunWorkerAsyncとかしようとしてもエラーになります。
BackgroundWorkerの後始末を考えるのが嫌になったので、
結局Threadを使い捨てにすることにしました。。。
プログレス処理の骨組みができているので、BackgroundWorkerは楽だったんですが。


解決済み
引用返信 編集キー/
■17042 / inTopicNo.9)  Re[6]: BackgroundWorkerが再利用できない
□投稿者/ Azulean (73回)-(2008/04/15(Tue) 22:59:19)
> 余談ですが、RunWorkerCompletedイベントハンドラの中でRunWorkerAsyncとかしようとしてもエラーになります。
ごめんなさい。これ嘘っぱちでした。
実験し直した結果、そんな仕様・実装ではないので、RunWorkerCompletedでRunWorkerAsyncしても問題ありません。

但し、RunWorkerCompletedが処理される前にIsBusy判定→RunWorkerAsyncとやっていると面倒なことにはなりそうです。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -