使用库中的函数同步wpf进度条的正确方法

Nya*_*ova 7 c# wpf progress-bar

我正在使用库中的函数来处理非常大的单词文件,我无法更改此功能.在处理时,我想显示一个进度条,因为无论哪种方式,应用程序看起来都冻结了,用户也不知道它实际上正在工作.现在我正在使用这样的工人:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Rhy*_*hys 3

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

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

XAML

   <ProgressBar Margin="10" IsIndeterminate="True" />
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢 Windows Phone 上的动画移动点。这里已经实现了一个例子。

如果这不是您所需要的,下一个最佳方法是估计总时间,并用 a 细分该时间DispatchTimer以给出周期性事件以增加进度条。这显然有两个问题,要么在达到 100% 之前完成(不是坏事),要么达到 100% 并卡在那里,因为实际时间明显长于估计时间。第二个不良效果将使应用程序再次看起来不活动。