【问题标题】:Update WPF ProgressBar from invoked action从调用的操作更新 WPF ProgressBar
【发布时间】:2016-09-11 11:01:26
【问题描述】:

首先,我应该提到我已经阅读了this postthisthis,但它们似乎都没有解决我的问题。

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

【问题讨论】:

  • @MichalHainc 我没有粘贴完整的代码,因为如果没有 DLL,它将毫无用处。我尽可能清楚地说明了这个问题。破坏 dll 调用意味着 dll 之前获得了正确的数据,但奇怪的是,之后却没有。也不例外

标签: c# wpf progress-bar backgroundworker


【解决方案1】:

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

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

https://github.com/michalhainc/ProgressBarMVVMDemo

【讨论】:

  • 我在上面。但是..你确定吗?
  • 没有解决我的问题,但还是 +1
  • 谢谢米哈尔。这很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多