从调用的操作更新 WPF ProgressBar

Update WPF ProgressBar from invoked action

首先,我应该提到我已经阅读了 this post and and this,但其中 none 似乎解决了我的问题。

简单来说,我有一个非托管 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。由于数小时毫无意义的谷歌搜索让我筋疲力尽,任何提示或解决方法将不胜感激。

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

正如我所承诺的,我创建了这个 github 存储库来演示如何使用进度条和后台任务...它是 WPF,我尝试遵循 MVVM 模式。

https://github.com/michalhainc/ProgressBarMVVMDemo