【问题标题】:C#: Popup form blocking despite BackgroundWorkerC#:尽管有 BackgroundWorker,但仍会阻止弹出表单
【发布时间】:2011-04-01 00:36:33
【问题描述】:

我正在使用 .net 2.0,并且我创建了一个表单 (System.Windows.Forms.Form) 用于在长时间运行的任务期间显示信息。

当我开始一个长时间运行的任务时,我创建了这个表单的一个新实例,调用 .Show() 并启动 BackgroundWorker。但是即使我使用 BackgroundWorker 来完成工作,表单确实会显示出来,但会立即阻塞并且在后台工作人员完成之前不会响应,i.d.出现了表单,但没有显示内容(gif 和文本框)?

奇怪的是,当 BackgroundWorker 的工作如此密集时,这不会发生!?!怎么会?

例子:

private void UpdateReportingTab()
{
    //p is an instance variable; Progressbar is just a simple form control
    //showing the passed message
    p = new Progressbar("Loading Data...");
    p.Show();
    BackgroundWorker bw = new BackgroundWorker();
    bw.WorkerSupportsCancellation = true;
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    bw.RunWorkerAsync();
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{            
    p.BeginInvoke(new MethodInvoker(p.Close));
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new MethodInvoker(delegate()
        {
            //long running database queries, whose results update text fields
            //while text fields are filled p show "no response"
            TextEditItems.Text = Convert.ToString(itemsDao.getItemCount());
            ....
        }
    }
}

谢谢!

安迪

【问题讨论】:

    标签: c# .net winforms user-interface backgroundworker


    【解决方案1】:

    因为你没有有效地运行后台工作程序,伙计;)

    后台工作者 INVOKES INVOKES INTO THE MAIN THREAD - 将工作放回主 UI 线程。

    在您需要之前,您不应再调用。

    特别是:

    • 进行长时间运行的数据库查询,检索结果
    • 然后调用回 UI 线程以更新 TextEditItems

    当您调用返回时,您又回到了 UI 线程上 - 在您的情况下,后台工作人员 therad 只进行调用......这使得后台工作人员毫无意义。

    【讨论】:

      【解决方案2】:

      通过使用BeginInvoke,您实际上是在 UI 线程上执行代码。你的BackgroundWorker 在这里没用,bw_DoWork 将立即返回,UI 将被冻结。

      如果您需要来自控件的一些数据,请在启动BackgroundWorker 之前检索它,然后在BGW 线程上完成工作,而不是调用InvokeBeginInvoke

      【讨论】:

        猜你喜欢
        • 2018-12-04
        • 2014-11-09
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        相关资源
        最近更新 更多