当前位置:  开发笔记 > 编程语言 > 正文

在C#中,在两个线程之间传递数据的推荐方法是什么?

如何解决《在C#中,在两个线程之间传递数据的推荐方法是什么?》经验,为你挑选了4个好方法。

我有我的主GUI线程,第二个线程在它自己的ApplicationContext中运行(以保持它活着,即使没有工作要做).我想从我的GUI线程调用我的第二个线程上的方法,但是如果我只是调用thread.Method(); 它似乎在我的主GUI线程上运行并导致我的GUI无响应.在不同线程上调用方法的最佳方法是什么?

更新: 我真正想要做的是在两个线程之间进行通信,而不是与GUI通信.GUI恰好是需要与我的第二个线程进行通信的线程之一.

更新#2: 好的,我一定是错过了什么.我创建了一个事件和一个委托,并让我的工作线程订阅了该事件.但是当我调用Invoke(MyEvent)时; 从我的GUI线程中,工作线程最终在GUI线程上工作并挂起GUI线程直到它完成处理.在没有轮询静态对象的情况下,我正在尝试做什么?



1> Jonathan All..:

哇,我简直不敢相信人们怎么也不费心去读这个问题.

无论如何,这就是我所做的.

    创建"消息"类.这将存储您要共享的所有信息.

    为每个线程创建一个队列.使用SyncLock(C#锁)对其进行读/写.

    当您想要与某个线程进行通信时,通过将该消息添加到队列中,向其发送一个消息对象,其中包含所需的所有信息的副本.

    然后,工作线程可以从队列中读取,按顺序读取和处理每条消息.没有消息时,只需睡觉即可.

确保不要在两个线程之间共享对象.一旦您的GUI线程在队列中粘贴消息,GUI线程就不再拥有该消息.它不能保留对该消息的引用,否则您将陷入麻烦.

这不会为您提供最佳性能,但对于大多数应用程序来说它都足够好.更重要的是,它会使犯错误更加困难.

更新:不要使用SyncLock和队列.而是使用ConcurrentQueue,它将自动为您处理任何锁定.你会获得更好的表现,并且不太可能犯错误.


我很惊讶其他回应被标记为答案.Jonathon描述的方法对我来说总是更有效.由于显而易见的原因,请确保不要将队列锁定的时间超过Enqueue()或Dequeue()所需的时间.在一个轻微的主题上,我还发现这种方法在具有三个线程(发送,接收和处理)和两个队列(Receive => Processing,和Processing => Send)的网络通信中非常有效.

2> Dour High Ar..:

.Net已经附带了一个System.ComponentModel.BackgroundWorker专门用于处理执行后台任务和与GUI通信的类.用它.



3> 小智..:

Dude,阅读Albahari的.Net线程免费电子书.我通过任何方式连接到它,所以这不是插头.我读过它,我的同事读了它,我已经多次使用它了.

我建议创建一个生产者/消费者类,在这里你可以启动一个等待(非阻塞)的线程,将任务排入队列,并发出信号以开始工作.

只是谷歌为它.



4> Rob Prouse..:

实际上,你已经创建了一个穷人的ThreadPool版本.你的第二个问题就是坐在那里什么都不做,如果没有相当多的工作,你不能让它为你工作.您必须将委托传递到一个队列,然后您的线程将起飞并执行.

您最好的选择是按照您的意图行事,只需使用.NET ThreadPool即可完成工作.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有