我的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中使用BGW的初始化代码创建了一个公共静态方法。现在每当我需要处理时,我首先从我的表单中调用此方法。 我想知道我的BGW实现是标准的还是有任何改进设计的方法。答案 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
,而是创建自己的线程,并在要报告进度时实施事件。我有这么多的错误,我可以自由地说它永远不会被使用。