使用Action和参数集合处理BackGroundWorker继承的正确方法是什么?

时间:2017-02-16 15:28:00

标签: c# reflection delegates backgroundworker

要清理经常使用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如此简单地被调用方法使用,同时使用变量类型和基于参数的计数关于我试图在后台运行的方法?

0 个答案:

没有答案