BackgroundWorker
前景に進行状況を表示しながら、いくつかの処理ジョブを実行するためにを使用しています。これで、他のスレッドで使用されるプロパティにアクセスすることは想定されていないことがわかりました。これにより、あらゆる種類のエラーが発生するようです。しかし、次の例では、そのようなことはしていないと思いますが、メソッドBackgroundWorker
に到達すると魔法のように終了します。ShowDialog()
public class ProcessingWindow
{
List<ProcessingJob> m_processingJobs = new List<ProcessingJob>();
private BackgroundWorker m_backGroundWorker = new BackgroundWorker();
public ProcessingWindow()
{
InitializeComponent();
/* Fill m_processingJobs with jobs */
m_backGroundWorker.WorkerReportsProgress = true;
m_backGroundWorker.WorkerSupportsCancellation = true;
m_backGroundWorker.DoWork += m_backgroundWorker_DoWork;
m_backGroundWorker.ProgressChanged += m_backgroundWorker_ProgressChanged;
m_backGroundWorker.RunWorkerCompleted += m_backgroundWorker_RunWorkerCompleted;
this.Loaded += ProcessingProgressWindow_Loaded;
}
void ProcessingWindow_Loaded(object sender, RoutedEventArgs e)
{
m_backGroundWorker.RunWorkerAsync();
}
private void m_backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
foreach (ProcessingJob job in m_processingJobs )
{
if (job.somethingIsWrong)
{
SomethingIsWrongDialog dialog = new SomethingIsWrongDialog(); // <-- Here it crashes!
// This statement is therefore never reached:
dialog.showDialog();
}
}
}
private void m_backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Debug.WriteLine("Finished!");
this.Close();
}
}
したがって、私のプログラムは のコンストラクターにヒットし、SomethingIsWrongDialog
クラッシュする代わりにスレッドを停止し、m_backgroundWorker_RunWorkerCompleted
何も起こらなかったかのようにメソッドを実行します。なぜこれが間違っているのですか?