泛化.NET后台工作者

GWL*_*osa 3 .net reflection multithreading backgroundworker winforms

我们正在开发一个Windows应用程序,它定期启动可能需要一些时间的操作.我们已经进入了一种模式,即在BackgroundWorker上运行这些操作,并为每个操作编写一个快速的WinForm,在这里您将表单传递给必要的参数,表单连接BackgroundWorker并进行函数调用,以及表单显示输出(进度条移动,文本填满更新等).

很明显,这种形式非常棒.表单副本之间唯一真正不同的部分是在哪个对象上调用哪个方法.所以我们喜欢做的是使它成为通用的,我们可以采用表单,传入一个对象(或静态调用的null?),一个函数名和一个参数数组,让它只是"去"从那里.我们已经能够用Reflection做到这一点.在这种情况下,我们不喜欢反思的是缺乏强烈的打字; 错误拼写方法调用之类的东西会在运行时捕获,而不是编译时.现在有什么可以使它更优雅和健壮吗?我听说有人谈论代表和表达树等事情; 但我不确定前者是否适用,对后者仍然有点暗淡.

dri*_*iis 6

创建一个公共表单并传递一个指向它应该在BackgroundWorker上运行的方法的委托,这将是一个明智的解决方案.

您可以让Form构造函数将泛型委托(Action可能是个好主意)作为参数,并在构造函数中传递一个与Action的签名匹配的lambda表达式.然后,foreach动作,您只需要指定适当的lambda表达式.

请记住,lambda表达式可以捕获局部变量,因此您可以调用之前执行的任何逻辑并传递相同的参数.