如何使C#加载类尽可能通用

时间:2014-07-07 17:19:39

标签: c# loading

我有这个类,应该接收一个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);
    }

}

3 个答案:

答案 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使用的模式,并制作"非常通用的方法"将对象作为单个参数的通用方法。该方法需要知道对象是什么以及将其转换为什么。