c# - 将 wpf 进度条与库中的函数同步的正确方法

标签 c# wpf progress-bar

我正在使用库中的函数来处理非常大的 word 文件,但我无法更改此函数。 在处理过程中,我想显示一个进度条,因为无论哪种方式,应用程序看起来都卡住了,用户不知道它实际上在工作。 现在我正在使用这样的 worker :

private void btnClick(object sender, RoutedEventArgs e)
{ 
    BackgroundWorker worker = new BackgroundWorker();
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.WorkerReportsProgress = true;
    worker.DoWork += worker_DoConvertOne;
    worker.ProgressChanged += worker_ProgressChanged;
    worker.RunWorkerAsync();
}

private void worker_DoConvertOne(object sender, DoWorkEventArgs e)
{
    var worker = sender as BackgroundWorker;
        //The progress bar is filled on 20%
        worker.ReportProgress(0);
        worker.ReportProgress(10);
        worker.ReportProgress(20);

        //Processing
        myLongLastingFunction(bigWordFile);

        //The progress bas is full
        worker.ReportProgress(100, "Done Processing.");
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("Converting finished!");
    TestProgressBar.Value = 0;
    ProgressTextBlock.Text = "";
}

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    TestProgressBar.Value = e.ProgressPercentage;
    ProgressTextBlock.Text = (string)e.UserState;
}

它正在工作,但它是一种解决方法,我想知道是否有解决我的问题的正确方法。提前致谢。 :)

最佳答案

我从你的问题中了解到,改变 myLongLastingFunction 不可能为你提供进度的定期更新,而且该功能目前不存在这种能力。

对于无法确定任务持续时间的这些情况,带有依赖属性 IsIndeterminate="True" 的进度条是向用户提供此信息的公认方式。这使进度条动画连续滚动。

XAML

   <ProgressBar Margin="10" IsIndeterminate="True" />

我个人更喜欢在 Windows Phone 上看到的动画移动点。一个例子已经实现here .

如果这不是您所需要的,下一个最佳方法是估计总时间,并用 DispatchTimer 分割这段时间以提供周期性事件以增加进度条。这显然有两个问题,要么在达到 100% 之前完成(这不是一件坏事),要么达到 100% 并卡在那里,因为实际时间比估计时间长得多。第二个不良影响会使应用程序再次看起来不活跃。

关于c# - 将 wpf 进度条与库中的函数同步的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35033629/

相关文章:

c# - 如何使用抛出 InvalidOperationException 的计时器更改标签内容

c# - 数据网格模板 [WPF]

android - 如何根据进度条的填充程度更改进度条的颜色?

Android SeekBar 自动更改大小并偏移 "thumb",因此没有任何内容正确排列

c# - 刷新进度条

C#在对父类(super class)对象进行操作时获取对子类变量的访问

c# - c#中每个元素的两个数组比较的最小值

c# - UI 仍然卡住使用 backgroundWorker

c# - 从 C# .NET 调用使用 C 样式数组作为参数的 C 方法

c# - Unity ViewtoWorldPoint 不工作,我做错了什么?