我正在运行数据导入,使用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/