Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
BackGroundWorkerを使った時の初回例外
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30787#CommentId85414
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2022/8/12 01:15:21
【るきお さん】
> ReportProgress メソッドの引数の話をされていますでしょうか?
> このメソッドの引数には文字列を渡せません。
ReportProgress(Integer, Object) メソッドなオーバーロードで渡せますよ。
Integer の方は、ReportProgress の e.ProgressPercentage への受け渡しで、
Object の方は、ReportProgress の e.UserState への受け渡しですね。
それ以外でワーカースレッドと UI スレッドを繋ぐものとしては、下記の機能があります。
UI スレッドからワーカースレッドへ受け渡せる情報:
RunWorkerAsync(Object) メソッド → DoWork での e.Argument
CancelAsync() メソッド → CancellationPending プロパティ
ワーカスレッドから UI スレッドで受け渡せる情報:
DoWork での e.Cancel → RunWorkerCompleted での e.Cancelled
DoWork 内での例外 → RunWorkerCompleted での e.Error
DoWork 内での e.Result → RunWorkerCompleted での e.Result
※RunWorkerCompleted の e.UserState は使われません。
【ビアンコ さん】
>> 今回、とあるFormでBackGroundWorkerを使っているのですが、
>> ProgressChangedイベントで対象Form上のLabelのTextを書き換えようとすると、
× BackGroundWorker
○ BackgroundWorker
DoWork 内で、フォームのフィールド変数やコントロールにはアクセスしていない、ということですよね。
(ワーカースレッドからの Invoke や BeginInvoke の呼び出しも行っていないという想定です)
RunWorkerAsync() を呼んだ場合と、RunWorkerAsync(Object) を呼んだ場合とでは
内部処理の System.ComponentModel.AsyncOperationManager の扱いが多少異なるものの、
ReportProgress を DoWork 内から呼ぼうと、UI スレッドから呼ぼうと、
ProgressChanged は UI スレッドに対して通知されると認識していたのですが…。
>> デバッグ時に以下の初回例外メッセージが表示されます。
Debug ビルド時のみの事象で、Release ビルド時には再現しない状況でしょうか。
それと、そのメッセージがどこに表示されるのかも確認させてください。
イミディエイトウィンドウ(あるいは出力ウィンドウ)に表示されるだけで、
動作そのものは問題は出ていない状況でしょうか。
あるいは例外として処理が中断してしまっている状況でしょうか。
後者の例外中断の場合は、どの行で停止しているのかを確認して、
その時の StackTrace を追跡してみてください。
前者の出力メッセージだけのものだとすると、[デバッグ]-[ウィンドウ]-[例外設定]で
キャプチャする設定になっているのかもしれません。
(2013 の初期設定がどうなっているかは分かりませんが)
>> VS2013のVBで作られたWindows Formアプリを修正しています。
Visual Studio 2013 で作成されたプロジェクトを、
Visual Studio 2013 で修正している、という状況でよろしいでしょうか。
そのプロジェクトの .NET Framework バージョンを教えてください。
あと、ビルドターゲット(x86, AnyCPU 等)も知りたいです。
2013 は手元に環境が無いので試せていないのですが、少なくとも
VS2022 Enterprise + .NET Framework 4.8.1 + Windows 11 21H2 環境で試したところ、
当方では事象を再現するには至っていません。
また、それぞれのイベントで Thread.CurrentThread.ManagedThreadId を確認してもみましたが、
ProgressChanged が非 UI スレッドとなる現象は今のところ確認できていません。