【问题标题】:although I am using a background worker GUI still hanging...虽然我正在使用后台工作人员 GUI 仍然挂起......
【发布时间】:2011-11-22 23:55:01
【问题描述】:

我有一个 GUI 我必须在其中导入一些文档,但是当我使用后台工作程序时,GUI 挂起,这一定不会发生,因为我使用的是后台工作程序,为什么会发生这种情况?请在下面找到代码..

void ImportNotes_ContextMenuStripItem_Click(object sender, EventArgs e)
{
    if (!backgroundWorker_notesImport.IsBusy)
    {
        mainFrm.ProgressBar.Visible = true;
        backgroundWorker_notesImport.RunWorkerAsync();
    }
}

private void backgroundWorker_notesImport_DoWork(object sender, DoWorkEventArgs e)
{
    ImportNotes();
}

private void backgroundWorker_notesImport_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    mainFrm.ProgressBar.Value = e.ProgressPercentage;
}

void ImportNotes() { }

【问题讨论】:

  • 更新进度条的次数。如果你把进度条挂钩,挂起会消失吗?
  • 通过GUI挂起,你的意思是窗口甚至不会重新绘制,不能调整大小等?还是说进度条没有更新?
  • 此代码不会挂起您的 GUI。你一定漏掉了重要的部分

标签: c# .net user-interface backgroundworker


【解决方案1】:

ImportNotes() 方法是否只是一步完成整个导入?

如果是这样,那么您仍然没有给 UI 做任何事情的机会。 example from the MSDN 显示了它应该如何使用:

    // This event handler is where the time-consuming work is done.
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 1; i <= 10; i++)
        {
            if (worker.CancellationPending == true)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                // Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(500);
                worker.ReportProgress(i * 10);
            }
        }
    }

您需要有一个允许进行某些处理的循环(在本例中为 Sleep)和对 ReportProgress 的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2010-12-24
    • 2014-06-21
    • 2018-11-08
    相关资源
    最近更新 更多