如何使用Background Worker ProgressChanged

时间:2018-09-12 05:27:35

标签: c# wpf inheritance backgroundworker

我需要更新仍在办公室三个月时执行的程序。而且我发现代码不干净而且不容易修改。

我所做的是在后台工作程序中调用了每种方法。而且我为可能一次执行的每个任务创建了多个背景工作人员。

因此,我正计划使代码更整洁,更易于维护。

我创建了一个类并继承了BackgroundWorker,如下代码所示

public class Bgw : BackgroundWorker
    {
        BackgroundWorker worker;
        public int ProcessId { get; set; }
        public object[] ProcessData { get; set; }

        public Bgw(int i, object[] obj)
        {
            ProcessId = i;
            ProcessData = obj;
            worker = new BackgroundWorker();

            worker.DoWork += Worker_DoWork;
            worker.WorkerSupportsCancellation = true;
            worker.WorkerReportsProgress = true;
            worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
            worker.ProgressChanged += Worker_ProgressChanged;

            worker.RunWorkerAsync();
        }

        public void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

        }

        public void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }

        public void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            if (ProcessId == 1)
            {
                //executed my code here
            }
        }
    }

但是使用上面的代码。如果我像这样调用类,该如何通知控件中的更改

var obj = new object[3];
                obj[0] = 1;
                obj[1] = PdfPath;
                obj[2] = EpubPath;
                var work = new Bgw(1, obj);

或者有更好的方法吗?我知道我需要使用ProgressChanged。但是我如何从我上课的那地方得到改变呢?

谢谢

编辑:如果我要使用异步并像这样等待

class Program
{


    public async static void TestAsyncAwaitMethods()
    {
        await Task.Run(() =>
        {
            for (var i = 0; i <= 5000000; i++)
            {
                UpdateUI(i);

            }
        });
    }

    private static void UpdateUI(int i)
    {
        Console.WriteLine("Update the UI: " + i);
    }

}

并调用方法TestAsyncAwaitMethods()

如何更新我的GUI。当该方法位于不同的类中并且我要更新的属性位于另一个类中时(我正在使用mvvm模式)。

0 个答案:

没有答案