后台工作程序中的进度条获取在主线程c#wpf中更新的参数

时间:2016-05-31 09:35:16

标签: c# wpf multithreading backgroundworker

我的主要线程是WPF中的向导。

用户完成后设置向导的属性,它处理数据。

需要几秒钟,我想提出一个报告进度的进度条。

因此,我总是在主线程变量上调用currentStep。

我有完全的thresholdStep步骤,等于12。

所以我希望进度条可以作为一个线程运行,但它也将通过使用currentStep变量连接到主线程。

所以,我像背景工作者一样使用这个:

public partial class MessageWithProgressBar : Window
{
    private BackgroundWorker backgroundWorker = new BackgroundWorker();
    public MessageWithProgressBar()
    {
        InitializeComponent();
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.ProgressChanged += ProgressChanged;
        backgroundWorker.DoWork += DoWork;
        backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
    }

    private void DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(100);
        int i = (int)e.Argument;
        backgroundWorker.ReportProgress((int)Math.Floor((decimal)(8*i)));
        if (i > GeneralProperties.General.thresholdStep)
            backgroundWorker.ReportProgress(100);
    }

    private void ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progress.Value = e.ProgressPercentage;
    }

    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        WindowMsg msg = new WindowMsg();
        msg.Show();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        if (backgroundWorker.IsBusy == false)
            backgroundWorker.RunWorkerAsync(GeneralProperties.General.currentStep);
    }
}

另外,我从主线程调用后台工作程序如下:

MessageWithProgressBar progress = new MessageWithProgressBar();
progress.Show();

实际发生的事情是,DoWork仅使用currentStep = 1调用一次,并且它不会更新与主线程相关的主线程,主线程也更新了currentStep依赖它的进度。

任何想法如何解决?

谢谢!

1 个答案:

答案 0 :(得分:2)

更改您的DoWork方法,如下所示:

 private void DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(100);
        int i = (int)e.Argument;
        do
        {   
            i = GeneralProperties.General.currentStep;
            backgroundWorker.ReportProgress((int)Math.Floor((decimal)(8 * i)));
            if (i > GeneralProperties.General.thresholdStep)
               backgroundWorker.ReportProgress(100);
        }
        while (i < GeneralProperties.General.thresholdStep);
    }

如果您在访问对象时使用synchronization,请确保您的GeneralProperties.General对象没有遇到线程lock问题。

<强> 更新:

更新问题:

 private void ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
        {
            progress.Value = e.ProgressPercentage;
        }), null);
    }