私はこのようなものが含まれている[STAThread]メインを持っています。バックグラウンド作業は、次のように初期化される:今クロススレッドの問題は、BackgroundWorkerのとReportProgress
MyBackgroundWorker = new BackgroundWorker();
MyBackgroundWorker.WorkerSupportsCancellation = true;
MyBackgroundWorker.WorkerReportsProgress = true;
MyBackgroundWorker.DoWork +=new DoWorkEventHandler(MyBackgroundWorker_DoWork);
MyBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(MyBackgroundWorker_ProgressChanged);
MyBackgroundWorker.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(MyBackgroundWorker_RunWorkerCompleted);
MyBackgroundWorker.RunWorkerAsync();
、バックメインフォーム(TopViewFormのインスタンス)への進捗状況を報告するために、列挙子のスレッドがいくつかの適切なユーザーオブジェクトとReportProgressを呼んでいます。 ReportProgressは、ProgressChangedイベントの形で到着し、Enumerator自体が作成されたスレッド(つまり、BackgroundWorkerのスレッドではない)であるメインのUIスレッドで実行されます。
この場合、このオブジェクトのイベントに応答して、メインプロセススレッド上のノードをTreeViewに設定しようとすると、クロススレッド違反エラーが発生する可能性はありますか? ProgressChangedは、はがメインプロセススレッド上で実行されているように見えず、コールスタックを見ています。
私は、Application.Runが新しいスレッドを生成し、そのフォームを実行すると仮定します。しかし、ドキュメンテーションはそうでないと言います。私は愚かな誤りを犯したか、ここで私が理解できない何かがあります。
誰もが考えていますか?
BgwはApplication.Run()と密接に連携しているため、フォームの内部に移動します。 –
あなたの両方の良い考え。私がフォーム内で移動すると、正常に動作します。 – Robinson
さて、答えとして追加する最初のものは、ポイントを取得します:) – Robinson