C# MVVM模式下简单进度条无法实时更新的问题及解决方案
问题原因
WPF的界面渲染、属性变更通知处理逻辑都运行在UI主线程上。你原有代码中调用的System.Threading.Thread.Sleep(1000)会直接阻塞当前运行的UI主线程,阻塞期间UI线程无法处理任何界面重绘请求,中间修改Progress属性触发的变更通知全部积压在消息队列中,直到4秒后Work方法执行完成、UI线程解除阻塞,才会一次性处理所有变更,所以只会显示最终的100%进度,没有中间动画。
解决方案
把ViewModel.cs中的Work方法修改为异步实现,用await Task.Delay替换Thread.Sleep即可:
public async void Work() { Progress = 0; await Task.Delay(1000); Progress = 25; await Task.Delay(1000); Progress = 50; await Task.Delay(1000); Progress = 75; await Task.Delay(1000); Progress = 100; }
实现逻辑说明
await Task.Delay不会阻塞当前线程,等待期间会将UI线程的控制权交还给系统,UI线程可以正常处理界面重绘、用户交互等操作,等待时长结束后再回到后续代码继续执行,每次修改Progress属性后界面都能正常更新进度条状态。
补充:如果实际业务中存在耗时计算、IO操作等逻辑,也要将耗时逻辑放在异步方法中执行,避免阻塞UI线程,才能保证界面更新流畅。
内容的提问来源于stack exchange,提问作者Jensolo
相关产品推荐
相关产品推荐

