BackgroundWorkerの例外エラー への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 heaven  (社会人) 投稿日時 2010/12/13 18:21:59
その様な事が起こっていたんですね。
DoWorkの処理が終えたらそのスレッドはどの道停止するものだと思っていたのでDoWorkの最後に別スレッドを呼んでいました。
またよろしくお願いします。
投稿者 shu  (社会人) 投稿日時 2010/12/13 18:01:30
> あそこでエラーが発生する要因は分からないままですが、どうもありがとうございました。 
DoWork内は別スレッドなのでbg2の実行が別スレッドをメインとして開始されてしまうので
Completeイベントが発生してもbg1のスレッド内で呼ばれてしまうのです。
投稿者 heaven  (社会人) 投稿日時 2010/12/13 17:54:24
RunWorkCompletedイベントで2つ目のスレッドを開始したところ上手く閉じることが出来ました。
あそこでエラーが発生する要因は分からないままですが、どうもありがとうございました。
投稿者 shu  (社会人) 投稿日時 2010/12/13 16:52:13
> DoWorkイベント内の最後に2つ目のスレッドを開始させておりました。
>   Private Sub bg_DoWork(sender ~) handles bg.DoWork
>                ~
>        bg2.RunWorkAsync()
>    End Sub
>
> 多分、コレが原因かもしれません。 
間違いないかと思います。
投稿者 heaven  (社会人) 投稿日時 2010/12/13 15:55:29
すみません、一部間違っていました。

shuさんの指摘通り処理コードを見直してみると1つ目のスレッドのDoWorkイベント内の最後に2つ目のスレッドを開始させておりました。

    Private Sub bg_DoWork(sender ~) handles bg.DoWork
                ~
        bg2.RunWorkAsync()
    End Sub

多分、コレが原因かもしれません。
投稿者 shu  (社会人) 投稿日時 2010/12/12 22:07:34
Form1、Form2を作成して
提示されたコードで各処理なしで実行したところ
エラーは再現できませんでした。処理自体に何か
あるのではないでしょうか?
投稿者 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/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

こんな感じですか?
投稿者 heaven  (社会人) 投稿日時 2010/12/11 01:53:45
>開いたフォームが別スレッドなら閉じることは出来ないです。

それはないと思います。
重い処理用に開いたサブフォームはメインフォームから通常の呼び出しで開いたフォームです。

'呼び出し例 
Dim f As New Form2
f.Show()


このサブフォームのBackgroundWorkerは2つ使っており、サブフォームのロード時に一つ目のDoWorkが起動し完了すると二つ目のDoWorkerが走るようにしてそれが終わった後のRunWorkerCompletedイベントでサブフォームを閉じる様にしています。


参考になるか分かりませんが、エラー箇所のSSもアップしてみます。
http://www1.axfc.net/uploader/Img/so/102475
投稿者 shu  (社会人) 投稿日時 2010/12/10 22:33:29
BackGroundWorkerを走らせたスレッドで開いたフォームなら
RunWorlerCompletedイベントで閉じることは可能だと思いますが、
開いたフォームが別スレッドなら閉じることは出来ないです。
そういうことはありませんか?
投稿者 heaven  (社会人) 投稿日時 2010/12/10 18:19:08
お世話になります。
現在重い処理をBackgroundWorkerコントロールを使って別スレッドで実行後フォームを閉じるプログラムを作っていますが、どうも考えられないエラーが発生して困っております。

DoWork イベント 内でフォームを閉じる命令を行うとInvalidOperationExceptionエラーが発生しますので、スレッドの処理を終えた後のRunWorkerCompletedイベントでフォームを閉じる命令を行ったのですが、
それでも「有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール '(フォーム名)' がアクセスされました。」と出てフォームを閉じられません。

RunWorkerCompleted イベントでもまだ別スレッドとして動作しているのでしょうか?