如何使用Task.Run实现加载DataGridView时显示进度条
WinForm加载DataGridView时进度条不显示最简解决方案
核心实现代码
// 给点击事件添加async修饰符 private async void btnLoad_click(object sender, EventArgs e) { string filename = txtfile.Text; progressBar.Visible = true; progressBar.Style = ProgressBarStyle.Marquee; // 仅将无UI依赖的耗时数据加载逻辑放入后台线程 DataTable dt = await Task.Run(() => GetDt(filename)); // await结束后自动回到UI线程,可直接操作控件 datagridview1.DataSource = dt; datagridview1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells; progressBar.Visible = false; }
方案说明
- 原问题根源:所有逻辑都在UI线程执行,UI线程被耗时操作占满无法重绘进度条,导致界面假死、进度条不显示;之前尝试的错误是把UI控件操作放入了后台线程,WinForm禁止非UI线程操作UI控件,因此抛出异常。
- 该方案是改动最小的实现方式:仅用
Task.Run包裹纯数据加载的非UI逻辑,await会默认捕获UI同步上下文,等待后台执行完成后自动切回UI线程执行后续代码,无需手动编写Invoke跨线程调度逻辑,完全匹配需求。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

