C# 使用操作和参数集合处理BackGroundWorker继承的正确方法?
为了清理经常使用C# 使用操作和参数集合处理BackGroundWorker继承的正确方法?,c#,reflection,delegates,backgroundworker,C#,Reflection,Delegates,Backgroundworker,为了清理经常使用BackgroundWorker并使用相同设置的代码,我创建了以下类作为帮助器: public class MyBackGroundWorker : System.ComponentModel.BackgroundWorker { private Action _action; private Action _stopAction; publi
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();
}`
处理程序和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();
}
为了解决这个问题,我查阅了一些涉及
委托的内容,但我知道这只是难题的一部分。从那以后,我在网上的搜索毫无结果,因为我不确定我需要研究什么方向。我该怎么办?这个想法本身可能存在根本性的缺陷,我愿意接受这一点,但是我能做些什么来实现我的目标,成为一个后台工作人员
,这样就可以被调用方法简单地使用,根据我试图在后台运行的方法使用变量类型和参数计数时?如果要有效地使BackgroundWorker接口冗余(即不需要使用DoWork事件、RunWorkerCompleted事件、RunWorkerAsync甚至CancelAsync)为什么不创建一个使用BackgroundWorker实例而不是从BackgroundWorker派生的新类呢?如果您想在可视化编辑器中使用组件,可以从组件派生新类。我想我也会遇到类似的难题。我需要能够在后台工作程序上执行这些方法,有些有参数,有些没有参数,并且无法预测参数的数据类型和参数的数量(即无需使用DoWork事件、RunWorkerCompleted事件、RunWorkerAsync甚至CancelAsync)为什么不创建一个使用BackgroundWorker实例而不是从BackgroundWorker派生的新类呢?如果您想在可视化编辑器中使用组件,可以从组件派生新类。我想我也会遇到类似的难题。我需要能够在后台工作程序上执行这些方法,有些带有参数,有些没有参数,并且参数的数据类型和参数的数量都无法预测。
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();
}