投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 スレッドとなる現象は今のところ確認できていません。