C# 在wpf中实时更新进度条

C# 在wpf中实时更新进度条,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我在让进度条实时显示更新时遇到了一些问题 这是我现在的代码 for (int i = 0; i < 100; i++) { progressbar1.Value = i; Thread.Sleep(100); } for(int i=0;iprogressbar1.value=value); 等待任务。运行(()=> { this.Dispatcher.Invoke((操作)(()=> { 在实际for循环发生之前进行一些预处理 for(int i=0;i{}块(一个

我在让进度条实时显示更新时遇到了一些问题

这是我现在的代码

for (int i = 0; i < 100; i++)
{
     progressbar1.Value = i;
     Thread.Sleep(100);
}
for(int i=0;i<100;i++)
{
progressbar1.值=i;
睡眠(100);
}
但是由于某些原因,当函数运行时,进度条显示为空,然后在函数运行完成之前,进度条将显示为空。有人能告诉我怎么做吗?我是C#/WPF新手,所以我不能100%确定如何在不同的线程上实现一个调度程序来解决这个问题(正如在其他一些文章中看到的)

为了澄清这一点,我的程序有一个按钮,按下该按钮时,会从文本框中获取值,并使用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);
             }
        }));
    });
}
专用异步无效搜索(对象发送方,RoutedEventArgs e)
{
变量进度=新进度(值=>progressbar1.value=value);
等待任务。运行(()=>
{
this.Dispatcher.Invoke((操作)(()=>
{
在实际for循环发生之前进行一些预处理
for(int i=0;i
谢谢大家!

您应该使用.NET中包含的,它为您提供了在事件中报告后台线程进度的方法。创建BackGroundWorker的线程自动调用此事件

可以使用向用户报告异步操作的进度

// This event handler updates the progress bar. 
private void backgroundWorker1_ProgressChanged(object sender,
    ProgressChangedEventArgs e)
{
    this.progressBar1.Value = e.ProgressPercentage;
}

有关使用此功能的更多信息,请参阅MSDN。

如果您使用的是.NET 4.5或更高版本,则可以使用:


设法使它工作。我所需要做的不是让它只是

progressBar1.value = i;
我不得不这么做

progressbar1.Dispatcher.Invoke(() => progressbar1.Value = i, DispatcherPriority.Background);

基本上就是你需要的。如果您在实现它时遇到困难,您可以显示更多的实际代码吗?去掉Dispatcher.Invoke-您所做的只是为整个操作阻塞UI线程。进程应该处理同步。问题是,如果没有Dispatcher.Invoke,当函数尝试执行时,就会出现这种情况。“调用线程无法访问此对象,因为另一个线程拥有它。”当函数尝试访问文本框中的内容时会发生这种情况。在哪一行?你在那里做其他的UI工作吗?添加调度程序。仅在与UI相关的部分上调用。是的,我正在创建标签,并将其添加到主网格。这也使用了一些外部API工具来获取信息,这些信息会进入标签内容。问题是我的按钮单击会循环X次,我希望这样,每次循环后,进度条都会更新:\n你能帮我实现吗?@nonion我不太明白你需要什么,但原理很简单:将所有耗时的工作放入等待任务中。运行(()=>{}
块(一个方法中可能有多个这样的块)。然后放入
((IProgress)progress)。报告(i)
每当你想更新进度条时。你可以在
报告
参数中放入任何整数值,而不是
i
,它将是进度条的新值。哦,好的,非常感谢你的帮助。我试图用实现的方法编译代码,我得到了这个错误:调用线程无法访问这个对象因为它是另一个线程拥有的。这是当我试图更改网格内的标签时。解决了如何修复它。()让程序编译,但现在我遇到的问题是,同样的事情也会发生,也就是说,条形图不会自动update@nonion如果没有实际的代码,很难说是什么问题。请使用新代码更新您的帖子。相反,您需要删除对'this.Dispatcher.Invoke((操作)()的调用=>
。通过使用
任务。运行“您在后台线程中,并要求在UI线程中执行辅助函数。难怪progressbar无法更新。在这个回答中,您将progressbar更新移动到后台线程,从而加剧了错误。@PanagiotisKanavos介意分享您的解决方案吗?@IamDOM事实上,这个答案是双重的错误-它不仅使用了过时的技术,而且用它来代替好的解决方案。问题已经使用了
Progress
,因此代码已经在.NET 4.5中运行,
progressBar1.value = i;
progressbar1.Dispatcher.Invoke(() => progressbar1.Value = i, DispatcherPriority.Background);