我有这个类,应该接收一个Control,设置一个新的PictureBox(加载gif)并启动一个新的BackGroundWorker。我需要将一个函数/方法传递给BackGroundWorker.DoWork()才能工作,然后在线程完成后关闭它。我的问题是我不知道如何使它尽可能通用。现在我想传递一个带有1个参数的函数,但是tommorow我可能需要传递2个参数或者根本没有参数(void)。
任何帮助都会被贬低。
罐
class Loading
{
private BackgroundWorker _bw = new BackgroundWorker();
private Control _control { get; set; }
private PictureBox _pic = new PictureBox() { Image = Properties.Resources.loading};
public Loading(Control control, VERY GENERIC METHOD)
{
_control = control;
_bw.DoWork += (sender, e) =>
{
_control.Invoke(new EventHandler(StartLoading));
};
_bw.RunWorkerCompleted += (sender, e) =>
{
_control.Invoke(new EventHandler(StopLoading));
};
_bw.WorkerSupportsCancellation = true;
}
private void StartLoading(object sender, EventArgs e)
{
_control.Controls.Add(_pic);
_bw.RunWorkerAsync();
}
private void StopLoading(object sender, EventArgs e)
{
this.Dispose();
_control.Controls.Remove(_pic);
}
}
答案 0 :(得分:1)
只需接受Action
即可。这里的代码没有需要传递给方法的信息,也不需要结果。如果调用者具有他们想要在委托的实现中使用的变量,他们可以使用lambda来关闭它们末尾的变量。
这很简单:
new Loading(someControl, () => SomeMethod(someVariable, someOtherVariable));
答案 1 :(得分:0)
这是你想要的吗?
public Loading(Control control, Action work)
{
_control = control;
_bw.DoWork += (sender, e) =>
{
_control.Invoke(new EventHandler(StartLoading));
work();
};
_bw.RunWorkerCompleted += (sender, e) =>
{
_control.Invoke(new EventHandler(StopLoading));
};
_bw.WorkerSupportsCancellation = true;
}
答案 2 :(得分:-1)
您可以使用.NET ThreadPool使用的模式,并制作"非常通用的方法"将对象作为单个参数的通用方法。该方法需要知道对象是什么以及将其转换为什么。