【发布时间】:2013-02-23 01:41:36
【问题描述】:
我有一个 windows 窗体应用程序和一个类。
该类在不同的线程中触发事件,因此我需要在接收事件的表单中的函数中编写Control.InvokeRequired和Control.Invoke()的代码。
是否有可能让所有线程处理都发生在类上,这样我就不需要在表单中做Invoke(),并假设所有即将发生的事件都已经在同一个线程上?
我正在考虑但我不喜欢的解决方案是在类的构造函数中启动一个虚拟控件,或者在类中传递对表单的引用,并检查InvokeRequired 是否。
还有其他可能的解决方案吗?
【问题讨论】:
-
"我正在考虑的解决方案,我不喜欢,是在类的构造函数中启动一个虚拟控件,或者在类中传递对表单的引用,并检查InvokeRequired 反对。” 同意,我也不喜欢这样,而且我不明白为什么会考虑它。检查
InvokeRequired或总是使用Invoke有什么问题?为什么这是一个你觉得需要“解决”的“问题”? -
默认情况下,一切都应该在 UI 线程上运行,除非您显式创建新线程、任务或在线程池中将项目排队。你能用最少的代码来证明这一点吗?
-
@EdS。我想将所有代码包装在类文件中,并将实现尽可能干净地留在表单中。就像处理普通 windows.forms 事件的方式一样。
-
@Despertar
Thread t = new Thread(()=>{ raiseEvent(); }); t.Start(); -
也许你可以利用一些面向方面的编程。我在这里发布了一个关于在 UI/主线程上执行方法调用的答案:stackoverflow.com/questions/11183026/… 也许你也可以申请这个?如果您将 UI 更改委托给带有特殊属性的方法,也许可以这样简化使用?
标签: c# .net vb.net multithreading invoke