首先,我应该提一下,我已经阅读了this post和this以及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
。任何提示或变通办法都会受到赞赏,因为我几小时无聊的谷歌搜索已经筋疲力尽。
答案 0 :(得分:1)
调度程序操作正在UI线程中执行。所以你的代码设计在那时已经很糟糕了,你在那里做了一些外部调用。将PINVOKING移动到后台任务/线程,并调用dispatcher.invoke只是为了从后台线程设置进度条进度。
正如我所承诺的那样,我创建了这个github存储库来演示如何使用progressbar&amp;后台任务......它是WPF,我试图遵循MVVM模式。