为什么Form.Refresh()不起作用?

Sha*_*ica 1 c# winforms

我正在运行数据导入,使用Windows窗体启动导入并显示进度.我有这么好的东西,用户友好,主要和次要的进度条和一切...但只有一个问题...表单刷新继续AWOL.

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

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

Fre*_*örk 9

听起来好像导入在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强制重绘表单.