我正在运行数据导入,使用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());
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您通常不需要调用Refresh强制重绘表单.
| 归档时间: |
|
| 查看次数: |
13232 次 |
| 最近记录: |