从调用的操作更新WPF ProgressBar

时间:2016-09-11 11:01:27

标签: c# wpf progress-bar backgroundworker

首先,我应该提一下,我已经阅读了this postthis以及this,但似乎没有一个能解决我的问题。

简单地解释一下,我有一个非托管DLL,在一个被调用的动作中被多次调用,即

var d = new List<string>();
var myData = new StringBuilder();

this.Dispatcher.Invoke(new Action(() =>
{
    myDLL.GetDataFromIndex(2, myData);
    d.Add(myData.ToString());

    myDLL.GetDataFromIndex(3, myData);
    d.Add(myData.ToString());

    myDLL.GetDataFromIndex(4, myData);
    d.Add(myData.ToString());

    //....
}
    ), System.Windows.Threading.DispatcherPriority.ContextIdle);

我想显示通过ProgressBar获取数据的进度。首先,我尝试在每个DLL调用之后立即更新ProgressBar,在每个d.Add(...)之后添加以下行

pbStatus.Value = newValue;

它显然不起作用,也破坏了myDLL次呼叫。然后我了解到ProgressBar必须通过BackgroundWorker进行更新,但我无法在调用的操作中定义新的BackgroundWorker。此外,DLL调用需要不同的时间。例如,在GetDataFromIndex(2, ...)完成20%的过程后,下一个索引各占5%到10%。现在我不知道如何在每次DLL调用后立即更新ProgressBar。任何提示或变通办法都会受到赞赏,因为我几小时无聊的谷歌搜索已经筋疲力尽。

1 个答案:

答案 0 :(得分:1)

调度程序操作正在UI线程中执行。所以你的代码设计在那时已经很糟糕了,你在那里做了一些外部调用。将PINVOKING移动到后台任务/线程,并调用dispatcher.invoke只是为了从后台线程设置进度条进度。

正如我所承诺的那样,我创建了这个github存储库来演示如何使用progressbar&amp;后台任务......它是WPF,我试图遵循MVVM模式。

https://github.com/michalhainc/ProgressBarMVVMDemo