Winforms应用程序在切换到另一个应用程序时挂起

时间:2010-03-12 16:45:56

标签: c# winforms multithreading backgroundworker

我相信我有潜在的线程问题。我有一个包含以下代码的用户控件:

    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();
    }

香草代码。但我遇到的问题是,当应用程序运行并且用户选中另一个应用程序时,如果他们返回我的应用程序挂起,他们会得到一个空白屏幕,他们必须杀死它。这是在我添加线程代码时开始的。我可以在那里找到一些流氓线程吗?什么是线程问题归零的最佳方法?这个问题无法在我的机器上重新创建......我知道我必须遗漏一些关于如何正确处理背景工作者的事情。感谢任何想法,谢谢,

2 个答案:

答案 0 :(得分:1)

你的代码片段没有解释它,但是当你使用BGW并且对它的IsBusy属性感兴趣时,阻塞UI线程永远不会那么困难。像这样的死锁通常很容易诊断,使用Debug + Break All。然后调试+ Windows +线程并双击主线程。然后调试+ Windows +调用堆栈以查看UI线程正在做什么。

常见的情况是UI线程在IsBusy属性上循环。 BGW无法完成,因为在UI线程空闲之前,其RunWorkerCompleted事件无法运行。

答案 1 :(得分:0)

您是否使用VerifyAppointments()方法访问GUI?您应该使用DoWorkEventArgs来传递您正在验证的参数,并且不应直接从BackgroundWorker访问GUI。

您只能在RunWorkerCompletedProgressChanged事件中安全地访问GUI。