我使用BackgroundWorker
来执行一些处理作业,同时显示前景的进度。现在我知道我不应该访问其他线程使用的属性,因为这似乎会导致各种错误。但在下面的例子中,我不认为我做的任何事情这样的,但是当它到达ShowDialog()
方法BackgroundWorker
神奇终止:为什么BackgroundWorker不能显示/显示对话窗口?
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
方法,就好像什么也没发生一样。为什么这是错的?
看看这个[问题](http://stackoverflow.com/questions/258662/unhandled-exceptions-in-backgroundworker)。正如我所假设的那样,只是因为某些东西已经完成并不意味着它已经成功完成。有一个错误属性作为包含异常的参数的一部分...从我理解的1分钟扫描中读取:) –
您能提供'SomethingIsWrongDialog'构造函数的代码吗?你尝试过调试吗?任何例外? – etaiso
'm_backgroundWorker_DoWork'在另一个线程上运行。正如你自己提到的,你不应该那样做。 – sloth