BackgroundWorker,方法

时间:2014-01-24 16:37:18

标签: c# backgroundworker

所以把标准的后台工作者放在一边。我正在研究如何使用背景工作者(工作DoWork {添加一些命令来做它})

所以这就是我到目前为止所提出的。在这种情况下,它做一些随机的WMI东西

查看/视图模型/型号 该模型称为ManagementModel

    public void Start(String Args)
    {
        if (!Worker.IsBusy)
        {
            //Objectivly here you can spawn an instance of a class and perform a method.. or put the function in the background worker itself depending on what you want the thing to do
            ManagementModel BackgroundManagementTask = new ManagementModel();
            Worker.RunWorkerAsync(BackgroundManagementTask); //Starts the background worker.
            //If you specify the class to shove into the background worker, you need to put the commands of what to do in the DoWork section.
        }
    }

我有一个方法,以及在Start方法中生成的类中的任何内容 这是DoWork的方法

    private void Workers_DoWork(object sender, DoWorkEventArgs Args)
    {
        //This is run on a completly seperate thread, you cannot make any changes to anything outside in this method.
        //you instead pass data through the Args.ReportProgress or Args.Result
        if (Worker.CancellationPending)
        {
            Worker.ReportProgress(100, "Cancelled By User");
            return;
        }
        else
        {
            //if you passed a method here, you will need to convert Args.Arguments back to what ever you passed it in as
            ManagementModel Internal = Args.Argument as ManagementModel;

            //bunch of stuff in the class that already works
            Internal.ComputerName = System.Environment.MachineName;
            Internal.Connect();
            Internal.ChangeWmiLocation("cimv2",null);
            ManagementObjectCollection ResultCollection = Internal.Query("Win32_Process");
            ClassProperties ResultProperties = Internal.DisplayProperties;

            //now return the results to the program thread
            Args.Result = ResultProperties;
            //now you need to deal with the data in the WorkerCompleted Event

            Worker.ReportProgress(100, "Completed");
            Thread.Sleep(60); //this is required at the end of each iteration of function
        }
    }

所以我的简单问题是。

  1. 这个概念是否可行,我可以启动整个类的实例并将其抛入后台worker并让后台worker在类中执行方法和功能
  2. 如果我必须将数据传回UI。你觉得结构是最好的方式吗?
  3. 我如何让ViewModel知道后台工作程序已完成并更新其公开的属性以供更新视图。
  4. 还是我离开基地?

1 个答案:

答案 0 :(得分:0)

  1. 是的,这个概念是可行的。您基本上可以让后台工作人员执行并访问您可以执行的任何操作,并在后台工作人员的方法之外访问;关键的一点是,没有两个线程应该同时处理那些没有明确规定的对象,这就是为什么你不应该从后台工作者的工作中访问你的用户界面的原因。线程(UI通常也经常被UI线程的内部方法使用)。

  2. 无论是使用结构还是类,都与线程无关;它不是属于给定线程的数据,而是属于操作。唯一的区别可能是,当传递一个struct时,会创建该struct的副本,你可以在后台工作线程中继续处理你的struct变量 - 但即便如此,对于在其中调用回调的方法也是如此。在进一步修改本地结构/对象之前自己的线程,所以这个决定实际上与线程无关。

  3. 调用一个UI方法,一旦后台工作程序完成其工作并且确保在UI线程上调用,就会导致对UI进行更新。后一部分可以通过各种方式完成,具体取决于UI工具包,UI控件可以提供调度程序对象或允许同步调用UI线程的调度程序对象。