我写了一个单线程程序(的WinForms MEH)和我期待它的表现是这样的:为什么没有后台工作人员不及时更新UI?
- 的MainForm开始进展显示形式
- 进展的形式呈现完全
- 进展形式receieves事件operationStarted这增加一张转圈图片
- 长效手术开始
- 进度表接收事件操作完成或操作失败并设置合适的图像
会发生什么是混乱。
- MainForm的进展开始显示形式
- 进展形式不完全呈现!
- 计划了一段时间
- 挂起当持久操作完成UI更新
为什么用更新的Windows窗体的滞后?
此减小的代码,如果必要
private bool Run(int commandIndex, string fullCommand)
{
if (operationStarted != null)
operationStarted(commandIndex);
// start long lasting external process
if (exitCode != 0)
{
if (operationFailed != null)
operationFailed(commandIndex, Error);
return false;
}
if (operationCompleted != null)
operationCompleted(commandIndex);
return true;
}
operationStarted,operationFailed & operationCompleted被正确地设置,以更新相应的图像。
您需要一个BackGroundWorker。你的_long_operations操作和UI一样运行在同一个线程中,所以它阻塞了线程来阻止UI被刷新 – Pikoh
问题是你的程序一步接一步地工作,所以它开始显示进度,之后甚至在它的渲染会启动您的持久操作并关闭您的操作,完成后,它会返回以继续显示UI。你需要一个Backgroundworker,它可以在另一个线程上执行此操作 –