You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:57:03