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

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

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

Re[2]: BackgroundWorkerで実施する処理に複数引数


(過去ログ 85 を表示中)

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

■50417 / inTopicNo.1)  BackgroundWorkerで実施する処理に複数引数
  
□投稿者/ やんまー (11回)-(2010/06/07(Mon) 01:53:40)

分類:[VB.NET/VB2005 以降] 

重い処理をBackgroundWorkerでバックグラウンドに回そうとしているのですがうまくいかず困っています。。。

実は、その重い処理の中では、フォーム上のtextboxなどの値を読み取る処理も入っていて、
読み取ろうとしたところで止まってしまいます。。。

バックグラウンド処理ではフォーム上にアクセスしてはいけないとのことでしたので、
引数で渡してやればいいのか・・・と思ったのですが、複数渡す必要があり、私の知識ではうまくすることができませんでした><

いろいろ探して

http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_8979.htm

の情報から

>'配列に放り込んで渡す
>BackgroundWorker1.RunWorkerAsync(New Object() {"a", "b", "c", 1, 2, 3})

とのことでしたので


backgroundWorker1.RunWorkerAsync(new Object(){ aaa , bbb } )

としてみました(aaa、bbbはstring)
コンパイルが通ったので、やった!、と思ったのですが、BackgroundWorker1DoWork側でうまく受けられませんでした。

こんなふうに受けてみたのですが・・・

Dim argv As String() = CType(e.Argument, String() )

ここで止まってしまいます。

止まってしまう、というのはエラーも出ないのですが、
前後にmsgboxで適当に文字を表示してみると、上記の行の次に行かないのです。。。

たぶん、この書き方がまずいと思うのですが、どうしたら良いのでしょうか・・・

どうか宜しく御願いたします。



引用返信 編集キー/
■50418 / inTopicNo.2)  Re[1]: BackgroundWorkerで実施する処理に複数引数
□投稿者/ Hongliang (645回)-(2010/06/07(Mon) 02:46:02)
> backgroundWorker1.RunWorkerAsync(new Object(){ aaa , bbb } )
Object() 型のオブジェクトを渡しているのですから、
> Dim argv As String() = CType(e.Argument, String() )
それを String() にキャストしてもどうしようもありません。
String しか使わないのなら、ハナから String() を New して引数に渡してやればいいでしょうし、String 以外のも使うのなら Object() を渡して Object() にキャストしてやる必要があります。

> 前後にmsgboxで適当に文字を表示してみると、上記の行の次に行かないのです。。。
MsgBox も使用するのは好ましくないかと思います。Debug.Print などを使って出力ウィンドウ(またはイミディエイトウィンドウ)に出力するようにするべきかと。
実際の動作としては、以下のような形になっていると推測できます。
・実行時例外 InvalidCastException(Object() のオブジェクトを String() にキャストできない)が発生
・BackgroundWorker1_DoWork 内で Catch してないので、BackgroundWorker1_DoWork メソッドから抜ける
・BackgroundWorker によってその例外が Catch され、RunWorkerCompleted イベントが起こされる
 BackgroundWorker1_RunWorkerCompleted メソッドに渡される引数 e の Error プロパティに、発生した例外 InvalidCastException が格納されている
引用返信 編集キー/
■50419 / inTopicNo.3)  Re[1]: BackgroundWorkerで実施する処理に複数引数
□投稿者/ やじゅ (1634回)-(2010/06/07(Mon) 07:16:56)
やじゅ さんの Web サイト
No50417 (やんまー さん) に返信
> backgroundWorker1.RunWorkerAsync(new Object(){ aaa , bbb } )
> Dim argv As String() = CType(e.Argument, String() )
> たぶん、この書き方がまずいと思うのですが、どうしたら良いのでしょうか・・・

Hongliangさんの回答の補足用

Multiple Args to Background worker
http://bytes.com/topic/visual-basic-net/answers/439118-multiple-args-background-worker

引用返信 編集キー/
■50436 / inTopicNo.4)  Re[2]: BackgroundWorkerで実施する処理に複数引数
□投稿者/ やんまー (12回)-(2010/06/07(Mon) 15:15:51)
Hongliang さん

ありがとうございます!

> String しか使わないのなら、ハナから String() を New して引数に渡してやればいい

であっさりうけとることができました(汗

>  BackgroundWorker1_RunWorkerCompleted メソッドに渡される引数 e の Error プロパティに、発生した例外 InvalidCastException が格納されている

あ、ここにエラーが入っているのですね・・・

確認します!
引用返信 編集キー/
■50437 / inTopicNo.5)  Re[2]: BackgroundWorkerで実施する処理に複数引数
□投稿者/ やんまー (13回)-(2010/06/07(Mon) 15:19:00)
やじゅ さん

> Multiple Args to Background worker
> http://bytes.com/topic/visual-basic-net/answers/439118-multiple-args-background-worker
>



なるほど、DirectCastというのを使うんですね。

これなら、いろんな型があっても受け取れますね!

御丁寧にありがとうございました!


# あと構造体でやる方法もあるんですね。こちらも試してみましたが、構造体の方が楽そうですね 汗

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -