我相信我有潜在的线程问题。我有一个包含以下代码的用户控件:
private void btnVerify_Click(object sender, EventArgs e)
{
if (!backgroundWorkerVerify.IsBusy)
{
backgroundWorkerVerify.RunWorkerAsync();
}
}
private void backgroundWorkerVerify_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
VerifyAppointments();
}
private void backgroundWorkerVerify_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Information was Verified.", "Verify",
MessageBoxButtons.OK, MessageBoxIcon.Information);
CloseEvent();
}
香草代码。但我遇到的问题是,当应用程序运行并且用户选中另一个应用程序时,如果他们返回我的应用程序挂起,他们会得到一个空白屏幕,他们必须杀死它。这是在我添加线程代码时开始的。我可以在那里找到一些流氓线程吗?什么是线程问题归零的最佳方法?这个问题无法在我的机器上重新创建......我知道我必须遗漏一些关于如何正确处理背景工作者的事情。感谢任何想法,谢谢,
何
答案 0 :(得分:1)
你的代码片段没有解释它,但是当你使用BGW并且对它的IsBusy属性感兴趣时,阻塞UI线程永远不会那么困难。像这样的死锁通常很容易诊断,使用Debug + Break All。然后调试+ Windows +线程并双击主线程。然后调试+ Windows +调用堆栈以查看UI线程正在做什么。
常见的情况是UI线程在IsBusy属性上循环。 BGW无法完成,因为在UI线程空闲之前,其RunWorkerCompleted事件无法运行。
答案 1 :(得分:0)
您是否使用VerifyAppointments()
方法访问GUI?您应该使用DoWorkEventArgs
来传递您正在验证的参数,并且不应直接从BackgroundWorker
访问GUI。
您只能在RunWorkerCompleted
或ProgressChanged
事件中安全地访问GUI。