要清理经常使用BackgroundWorker
且使用相同设置的代码,我创建了以下类作为帮助程序:
public class MyBackGroundWorker : System.ComponentModel.BackgroundWorker
{
private Action _action;
private Action _stopAction;
public List<dynamic> Parameters { get; set; } = new List<dynamic>();
MyBackGroundWorker(Action method, Action doWhenFinished = null)
{
this._action = method;
this._stopAction = doWhenFinished;
Init();
}`
"Init()"
包含每次都会应用的所有设置:
private void Init()
{
this.WorkerReportsProgress = true;
this.WorkerSupportsCancellation = true;
this.DoWork += new DoWorkEventHandler(StartWork);
this.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkDone);
}
处理程序和public
方法是:
private void StartWork(object sender, DoWorkEventArgs e)
{
if (Parameters.Count() > 0)
{
ParameterInfo[] pi = _action.Method.GetParameters();
//now i'm stuck!!!!!
}
else
{
_action.Method.Invoke(null, this.Parameters);
//i know this is wrong, wrote it in to illustrate the goal
}
}
private void WorkDone(object sender, RunWorkerCompletedEventArgs e)
{
_stopAction.Method.Invoke(null, null); //>.<
}
public void Go()
{
RunWorkerAsync();
}
public void Stop()
{
this.CancelAsync();
}
显然这里存在一些问题。最终目标是使用开始运行的方法初始化对象,最后执行的方法(可选)以及在运行之前添加的参数集合。调用类可能有这样的部分:
using(var cmd = new MyBackGroundWorker(method1, StopLoadingSpinner))
{
cmd.Parameters.Add("Stringparam");
cmd.Parameters.Add(1);
StartLoadingSpinner();
cmd.Go();
}
我看了一些涉及delegates
的事情试图解决这个问题,但我知道这只是一个难题。从那里开始,我的在线搜索毫无结果,因为我不确定我需要研究的方向。我从哪里开始?这个想法本身可能存在根本性的缺陷,我愿意接受这一点,但是我可以做些什么来实现我的目标BackgroundWorker
如此简单地被调用方法使用,同时使用变量类型和基于参数的计数关于我试图在后台运行的方法?