我有我的主GUI线程,第二个线程在它自己的ApplicationContext中运行(以保持它活着,即使没有工作要做).我想从我的GUI线程调用我的第二个线程上的方法,但是如果我只是调用thread.Method(); 它似乎在我的主GUI线程上运行并导致我的GUI无响应.在不同线程上调用方法的最佳方法是什么?
更新: 我真正想要做的是在两个线程之间进行通信,而不是与GUI通信.GUI恰好是需要与我的第二个线程进行通信的线程之一.
更新#2: 好的,我一定是错过了什么.我创建了一个事件和一个委托,并让我的工作线程订阅了该事件.但是当我调用Invoke(MyEvent)时; 从我的GUI线程中,工作线程最终在GUI线程上工作并挂起GUI线程直到它完成处理.在没有轮询静态对象的情况下,我正在尝试做什么?
哇,我简直不敢相信人们怎么也不费心去读这个问题.
无论如何,这就是我所做的.
创建"消息"类.这将存储您要共享的所有信息.
为每个线程创建一个队列
当您想要与某个线程进行通信时,通过将该消息添加到队列中,向其发送一个消息对象,其中包含所需的所有信息的副本.
然后,工作线程可以从队列中读取,按顺序读取和处理每条消息.没有消息时,只需睡觉即可.
确保不要在两个线程之间共享对象.一旦您的GUI线程在队列中粘贴消息,GUI线程就不再拥有该消息.它不能保留对该消息的引用,否则您将陷入麻烦.
这不会为您提供最佳性能,但对于大多数应用程序来说它都足够好.更重要的是,它会使犯错误更加困难.
更新:不要使用SyncLock和队列.而是使用ConcurrentQueue,它将自动为您处理任何锁定.你会获得更好的表现,并且不太可能犯错误.
.Net已经附带了一个System.ComponentModel.BackgroundWorker
专门用于处理执行后台任务和与GUI通信的类.用它.
Dude,阅读Albahari的.Net线程免费电子书.我通过任何方式连接到它,所以这不是插头.我读过它,我的同事读了它,我已经多次使用它了.
我建议创建一个生产者/消费者类,在这里你可以启动一个等待(非阻塞)的线程,将任务排入队列,并发出信号以开始工作.
只是谷歌为它.
实际上,你已经创建了一个穷人的ThreadPool版本.你的第二个问题就是坐在那里什么都不做,如果没有相当多的工作,你不能让它为你工作.您必须将委托传递到一个队列,然后您的线程将起飞并执行.
您最好的选择是按照您的意图行事,只需使用.NET ThreadPool即可完成工作.