如何在类文件中使用BackGroundWorker?

时间:2011-07-12 12:36:38

标签: c# .net backgroundworker

我的program.cs调用mdi父frmMain。然后,frmMain根据用户操作打开不同的子表单。

所有处理逻辑都是用BusinessLogic.cs编写的。 frmMain at load调用BusinessLogic.cs的方法来初始填充数据。子表单也调用BusinessLogic来获取数据并对其进行处理。我想通过BackGroundWorker完成所有这些操作,即frmMain调用BusinessLogic.cs的(比方说)StartBGWorker()方法,此方法为此特定调用创建一个后台工作程序,调用Do_work事件,执行提取和操作。处理完毕后关闭。

我对如何为背景工作者创建实例和事件感到茫然。那么我如何在类文件中使用backgroundworker呢?

编辑:也许我的逻辑错了,我应该为每个调用BusinessLogig.cs的表单添加一个BGW。然后每当我调用BusinessLogic的方法时,我都可以通过后台工作者来实现。这会是一个更好的实现吗?

编辑2:感觉有点愚蠢我的怀疑,因为我找到了办法。我刚刚在BusinessLogic中使用B​​GW的初始化代码创建了一个公共静态方法。现在每当我需要处理时,我首先从我的表单中调用此方法。 我想知道我的BGW实现是标准的还是有任何改进设计的方法。

3 个答案:

答案 0 :(得分:3)

包括:

using System.ComponentModel;

在班级中定义它:

private BackgroundWorker BackgroundWorker = new BackgroundWorker();

初始化:

BackgroundWorker.WorkerSupportsCancellation = false;
BackgroundWorker.WorkerReportsProgress = true;
BackgroundWorker.DoWork += BackgroundWorker_DoWork;
BackgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler( BackgroundWorker_RunWorkerCompleted );

开始吧:

BackgroundWorker.RunWorkerAsync();

用法与Windows Forms中的用法完全相同。

答案 1 :(得分:1)

您应该查看并行任务库。在那里,您可以启动,链接和同步异步操作。

http://msdn.microsoft.com/en-us/library/dd537609.aspx

您还可以使用委托,事件,Actio注入一个对象,该事件可以在新任务中触发以报告进度

例如

您实施这样的实体

  public class TaskData
    {
        private Action<int> Callback { get; private set; }

        public TaskData(Action<int> callbackAction)
        {
            this.Callback = callbackAction;

        }

        public void TriggerCallBack(int percentageComplete)
        {
            Action<int> handler = Callback;

            if (handler != null)
            {
                handler(percentageComplete);
            }
        }
    }

比使用此实体创建任务作为参数

TaskData data = new TaskData((percentage)=> Console.WriteLine(percentage + "% completed"));

            Task myTask = new Task(new Action<object>((para)=>
            {
                ((TaskData)para).TriggerCallBack(4);
            }

            ),data);

            myTask.Start();

            Console.ReadLine();

PS:代码只是一个快速而肮脏的黑客。随时改进它: - )

答案 2 :(得分:-5)

请不要使用System.ComponentModel.BackgroundWorker,而是创建自己的线程,并在要报告进度时实施事件。我有这么多的错误,我可以自由地说它永远不会被使用。