【发布时间】:2015-04-26 01:26:35
【问题描述】:
我无法让进度条实时显示更新。
这是我现在的代码
for (int i = 0; i < 100; i++)
{
progressbar1.Value = i;
Thread.Sleep(100);
}
但由于某种原因,当函数运行时进度条显示为空,然后在函数完成运行之前什么也没有。有人可以向我解释如何做到这一点吗?我是 C#/WPF 的新手,所以我不能 100% 确定如何在不同的线程上实现 Dispatcher(如其他一些帖子所示)来解决这个问题。
为了澄清,我的程序有一个按钮,当按下它时,它会从文本框中获取值,并使用 API 来检索信息,并基于它创建标签。我希望在每行数据处理完毕后更新进度条。
这就是我现在拥有的:
private async void search(object sender, RoutedEventArgs e)
{
var progress = new Progress<int>(value => progressbar1.Value = value);
await Task.Run(() =>
{
this.Dispatcher.Invoke((Action)(() =>
{
some pre-processing before the actual for loop occur
for (int i = 0; i < numberofRows; i++)
{
label creation + adding
((IProgress<int>)progress).Report(i);
}
}));
});
}
谢谢!
【问题讨论】:
-
stackoverflow.com/a/22085142/906773 基本上就是您所需要的。如果你在实现它时遇到问题,你能展示更多你的实际代码吗?
-
摆脱 Dispatcher.Invoke - 你所做的只是阻塞整个操作的 UI 线程。进度应该处理同步。
-
问题是当函数尝试执行时没有 Dispatcher.Invoke,就会出现这种情况。 “调用线程无法访问此对象,因为不同的线程拥有它。”当函数尝试访问文本框内的内容时会发生这种情况。
-
在哪一行?你在那里做其他 UI 工作吗?仅在与 UI 相关的部分上添加 Dispatcher.Invoke。
-
是的,我正在创建标签,并将其添加到主网格中。这也使用了一些外部 API 工具来获取信息,这些信息会进入标签内容。
标签: c# wpf wpf-controls