从调用的操作更新 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 模式。
首先,我应该提到我已经阅读了 this post and
简单来说,我有一个非托管 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 模式。