我正在运行数据导入,使用Windows窗体开始导入并显示进度。
我觉得这整个过程非常好并且用户友好,有主要和次要的进度条以及其他所有内容……但是只有一个问题……表格刷新使AWOL继续进行。

每次更新标签/进度条时,都会有一个Form.Refresh()呼叫,并且通常会开始工作。但是,如果我需要进入调试模式,只是为了稍稍延迟一下导入,Refresh()调用就会停止工作,有时即使我在没有调试模式的情况下运行,在某些不可预测的时刻也会发生同样的事情:标签和进度条不会更新,如果您隐藏该表单并重新打开它,则该表单根本不会重新绘制-它只会显示为完全白色。

为什么,为什么,Form.Refresh()停止工作,我该如何解决?

最佳答案

听起来好像是在UI线程上运行导入,这意味着该线程已被阻止,从而阻止了表单自身重新绘制。更好的方法是使用BackgroundWorker组件,在DoWork事件处理程序中进行导入,然后使用ProgressChanged更新UI。

例:

private void StartImport()
{
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.RunWorkerAsync();
}

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // do some work simulating a lenghy process which occasionally
    // reports progress with data back to the caller
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(200);
        backgroundWorker.ReportProgress(i, "Item No " + i.ToString());
    }
}

private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    listBox.Items.Add(e.UserState.ToString());
}


使用这种方法,您通常不需要调用Refresh来强制重新绘制窗体。

关于c# - 为什么Form.Refresh()不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2260753/

10-12 22:34