Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使C#加载类尽可能通用_C#_Loading - Fatal编程技术网

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

如何使C#加载类尽可能通用,c#,loading,C#,Loading,我有一个类,它应该接收一个控件,设置一个新的PictureBox(加载gif)并启动一个新的BackGroundWorker。我需要将一个函数/方法传递给BackGroundWorker.DoWork()来工作,然后在完成后关闭线程。我的问题是,我不知道如何使这个尽可能通用。现在我想传递一个有1个参数的函数,但是tommorow我可能需要传递2个参数,或者可能根本没有参数(void) 任何帮助都将不胜感激 坦克 }您可以使用.NET线程池使用的模式,使“非常通用的方法”成为将对象作为单个参数的通

我有一个类,它应该接收一个控件,设置一个新的PictureBox(加载gif)并启动一个新的BackGroundWorker。我需要将一个函数/方法传递给BackGroundWorker.DoWork()来工作,然后在完成后关闭线程。我的问题是,我不知道如何使这个尽可能通用。现在我想传递一个有1个参数的函数,但是tommorow我可能需要传递2个参数,或者可能根本没有参数(void)

任何帮助都将不胜感激

坦克


}

您可以使用.NET线程池使用的模式,使“非常通用的方法”成为将对象作为单个参数的通用方法。该方法需要知道对象是什么以及将其强制转换为什么。

这就是您想要的吗

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;
}

只需接受一个
操作
。这里的代码没有需要传递到方法中的信息,也不需要结果。如果调用者有他们想要在委托实现中使用的变量,他们可以使用lambda来结束其端的变量

这很容易:

new Loading(someControl, () => SomeMethod(someVariable, someOtherVariable));

您可能需要查看并向类中添加泛型参数。如何使用其他参数?您知道函数参数的
params
关键字吗?使用BGW的全部目的是它代表您处理到UI的封送代码。您不需要在已完成的处理程序中调用,您应该从
load
主体中的UI线程开始加载,而不是在
DoWork
处理程序中。在
DoWork
方法中启动worker是毫无意义的。另外,
\u bw
\u pic
应标记为
只读
,以表明其不在初始值设定项之外修改的意图。这将使您的代码更加健壮,并且还有一个额外的好处,即运行时可以基于不变的知识进行某些优化。您能举个例子吗?应该类似于此。。。但这总是假设我的方法没有参数。。。如果我想要一个参数,或者2?请使用签名为
void Work(params object[]args)
的委托,而不是
void Action()
。除非参数指向具有更改数据的类引用,否则不需要它。从逻辑上讲,您将在工作开始时收到一个数据快照,该快照包装在
Action()
委托中。请查看@Servy给出的答案,例如如何将参数包装到
Action()
中。
new Loading(someControl, () => SomeMethod(someVariable, someOtherVariable));