BackgroundWorkerの例外エラー
投稿者 shu  (社会人)
投稿日時
2010/12/10 22:33:29
BackGroundWorkerを走らせたスレッドで開いたフォームなら
RunWorlerCompletedイベントで閉じることは可能だと思いますが、
開いたフォームが別スレッドなら閉じることは出来ないです。
そういうことはありませんか?
RunWorlerCompletedイベントで閉じることは可能だと思いますが、
開いたフォームが別スレッドなら閉じることは出来ないです。
そういうことはありませんか?
投稿者 heaven  (社会人)
投稿日時
2010/12/11 01:53:45
>開いたフォームが別スレッドなら閉じることは出来ないです。
それはないと思います。
重い処理用に開いたサブフォームはメインフォームから通常の呼び出しで開いたフォームです。
このサブフォームのBackgroundWorkerは2つ使っており、サブフォームのロード時に一つ目のDoWorkが起動し完了すると二つ目のDoWorkerが走るようにしてそれが終わった後のRunWorkerCompletedイベントでサブフォームを閉じる様にしています。
参考になるか分かりませんが、エラー箇所のSSもアップしてみます。
http://www1.axfc.net/uploader/Img/so/102475
それはないと思います。
重い処理用に開いたサブフォームはメインフォームから通常の呼び出しで開いたフォームです。
'呼び出し例
Dim f As New Form2
f.Show()
このサブフォームのBackgroundWorkerは2つ使っており、サブフォームのロード時に一つ目のDoWorkが起動し完了すると二つ目のDoWorkerが走るようにしてそれが終わった後のRunWorkerCompletedイベントでサブフォームを閉じる様にしています。
参考になるか分かりませんが、エラー箇所のSSもアップしてみます。
http://www1.axfc.net/uploader/Img/so/102475
投稿者 shu  (社会人)
投稿日時
2010/12/11 21:57:00
Public Class ~
Private m_fm as Form2
Friend bg as BackGroundWorker '<--- Designerで定義、インスタンス作成
Friend bg2 as BackGroudWorker '<--- Designerで定義、インスタンス作成
Private Sub FirstProc()
m_fm = new Form2
m_fm.show()
bg.RunWorkAsync()
End Sub
Private Sub bg_DoWork(sender ~) handles bg.DoWork
~
End Sub
Private Sub bg_RunWorkerCompleted(~) handles bg.RunWorkCompleted
~
bg2.RunWorkAsync()
End Sub
Private Sub bg2_DoWork(sender ~) handles bg2.DoWork
~
End Sub
Private Sub bg2_RunWorkerCompleted(~) handles bg2.RunWorkCompleted
~
m_fm.Close()
m_fm.Dispose()
End Sub
こんな感じですか?
Private m_fm as Form2
Friend bg as BackGroundWorker '<--- Designerで定義、インスタンス作成
Friend bg2 as BackGroudWorker '<--- Designerで定義、インスタンス作成
Private Sub FirstProc()
m_fm = new Form2
m_fm.show()
bg.RunWorkAsync()
End Sub
Private Sub bg_DoWork(sender ~) handles bg.DoWork
~
End Sub
Private Sub bg_RunWorkerCompleted(~) handles bg.RunWorkCompleted
~
bg2.RunWorkAsync()
End Sub
Private Sub bg2_DoWork(sender ~) handles bg2.DoWork
~
End Sub
Private Sub bg2_RunWorkerCompleted(~) handles bg2.RunWorkCompleted
~
m_fm.Close()
m_fm.Dispose()
End Sub
こんな感じですか?
投稿者 heaven  (社会人)
投稿日時
2010/12/12 13:43:25
フォームの呼び出し方は少し異なりますがほぼそのような感じです。
Public Class Form1
Private Sub Button1_Click(sender ~) Handles Button1.Click
Dim f As New Form2
f.Show()
End Sub
Public Class Form2
'2つのBackGroudWorkerはDesignerで定義
Private Sub Form2_Load(sender ~) Handles MyBase.Load
bg.RunWorkAsync()
End Sub
Private Sub bg_DoWork(sender ~) handles bg.DoWork
~
End Sub
Private Sub bg_RunWorkerCompleted(~) handles bg.RunWorkCompleted
~
bg2.RunWorkAsync()
End Sub
Private Sub bg2_DoWork(sender ~) handles bg2.DoWork
~
End Sub
Private Sub bg2_RunWorkerCompleted(~) handles bg2.RunWorkCompleted
Me.Close
End Sub
投稿者 shu  (社会人)
投稿日時
2010/12/12 22:07:34
Form1、Form2を作成して
提示されたコードで各処理なしで実行したところ
エラーは再現できませんでした。処理自体に何か
あるのではないでしょうか?
提示されたコードで各処理なしで実行したところ
エラーは再現できませんでした。処理自体に何か
あるのではないでしょうか?
投稿者 heaven  (社会人)
投稿日時
2010/12/13 15:55:29
すみません、一部間違っていました。
shuさんの指摘通り処理コードを見直してみると1つ目のスレッドのDoWorkイベント内の最後に2つ目のスレッドを開始させておりました。
Private Sub bg_DoWork(sender ~) handles bg.DoWork
~
bg2.RunWorkAsync()
End Sub
多分、コレが原因かもしれません。
shuさんの指摘通り処理コードを見直してみると1つ目のスレッドのDoWorkイベント内の最後に2つ目のスレッドを開始させておりました。
Private Sub bg_DoWork(sender ~) handles bg.DoWork
~
bg2.RunWorkAsync()
End Sub
多分、コレが原因かもしれません。
投稿者 shu  (社会人)
投稿日時
2010/12/13 16:52:13
> DoWorkイベント内の最後に2つ目のスレッドを開始させておりました。
> Private Sub bg_DoWork(sender ~) handles bg.DoWork
> ~
> bg2.RunWorkAsync()
> End Sub
>
> 多分、コレが原因かもしれません。
間違いないかと思います。
> Private Sub bg_DoWork(sender ~) handles bg.DoWork
> ~
> bg2.RunWorkAsync()
> End Sub
>
> 多分、コレが原因かもしれません。
間違いないかと思います。
投稿者 heaven  (社会人)
投稿日時
2010/12/13 17:54:24
RunWorkCompletedイベントで2つ目のスレッドを開始したところ上手く閉じることが出来ました。
あそこでエラーが発生する要因は分からないままですが、どうもありがとうございました。
あそこでエラーが発生する要因は分からないままですが、どうもありがとうございました。
投稿者 shu  (社会人)
投稿日時
2010/12/13 18:01:30
> あそこでエラーが発生する要因は分からないままですが、どうもありがとうございました。
DoWork内は別スレッドなのでbg2の実行が別スレッドをメインとして開始されてしまうので
Completeイベントが発生してもbg1のスレッド内で呼ばれてしまうのです。
DoWork内は別スレッドなのでbg2の実行が別スレッドをメインとして開始されてしまうので
Completeイベントが発生してもbg1のスレッド内で呼ばれてしまうのです。
投稿者 heaven  (社会人)
投稿日時
2010/12/13 18:21:59
その様な事が起こっていたんですね。
DoWorkの処理が終えたらそのスレッドはどの道停止するものだと思っていたのでDoWorkの最後に別スレッドを呼んでいました。
またよろしくお願いします。
DoWorkの処理が終えたらそのスレッドはどの道停止するものだと思っていたのでDoWorkの最後に別スレッドを呼んでいました。
またよろしくお願いします。
現在重い処理をBackgroundWorkerコントロールを使って別スレッドで実行後フォームを閉じるプログラムを作っていますが、どうも考えられないエラーが発生して困っております。
DoWork イベント 内でフォームを閉じる命令を行うとInvalidOperationExceptionエラーが発生しますので、スレッドの処理を終えた後のRunWorkerCompletedイベントでフォームを閉じる命令を行ったのですが、
それでも「有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール '(フォーム名)' がアクセスされました。」と出てフォームを閉じられません。
RunWorkerCompleted イベントでもまだ別スレッドとして動作しているのでしょうか?