.net - 生成 .NET 后台工作程序

标签 .net winforms multithreading reflection backgroundworker

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

现在很明显,这种形式非常千篇一律。表单副本之间真正不同的唯一部分是在哪个对象上调用哪个方法。所以我们想做的是让它成为通用的,这样我们就可以采用形式,传入一个对象(或 null 用于静态调用?),一个函数名和一个参数数组,然后让它“运行”从那里。我们已经能够通过反射做到这一点。在这种情况下,我们不喜欢反射的地方是缺乏强类型;诸如拼写错误的方法调用之类的事情在运行时被捕获,而不是编译时。现在有什么可用的东西可以使它更加优雅和健壮吗?我听说有人在谈论诸如代表和表达式树之类的东西;但我不确定前者是否适用,但我对后者仍然有些不知所措。

最佳答案

制作一个通用表单并将其传递给指向它应该在 BackgroundWorker 上运行的方法的委托(delegate),这将是一个明智的解决方案。

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

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

关于.net - 生成 .NET 后台工作程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/722518/

相关文章:

.net - 使用xmlrpc和vb.net在wordpress中发布错误

c# - CheckedListBox - 按文本搜索项目

python - TkInter 在线程运行时禁用按钮

Java多线程客户端/服务器-java.net.SocketException : Socket closed

c# - 如何根据 app.config 多次导出一个 MEF 插件?

.net - TFS 2010 为 .Net 3.5 应用程序创建 .Net 4.0 XmlSerializers DLL

c# - 在 visual studio 2010 中添加安装项目的快捷方式

ios - Metal 性能调试

.net - 内部企业 Web 应用程序的最佳单点登录实现

C#/异步网络和GUI之间的通信