一个线程可以与另一个线程通信吗?

时间:2012-02-05 06:55:04

标签: c# callback

C#中是否有办法根据线程的线程ID或名称向另一个线程发送消息?

基本上,对于学校的项目,我的教授希望我们做生产者/消费者交易,但是将生成的对象序列化为从生产者到消费者的字符串(例如xml)。从消费者线程中的缓冲区中提取字符串后,每个字符串都会被解码(包括threadid)并进行处理,并通过回调通知原始生产者。那么如何使用线程ID将事件发送到原始生产者线程?

4 个答案:

答案 0 :(得分:1)

你可以编写一个包含Dictionary< string,thread>包含所有线程的成员。创建线程时,将其添加到字典中,以便稍后可以从类中的任何位置按名称(键)返回它。这样,您还可以在线程之间共享资源,但请确保锁定任何共享资源以防止并发问题。

答案 1 :(得分:1)

使用线程时,不要尝试在它们之间发送消息。线程可以使用共享内存来自我同步 - 这称为同步对象。为了管理使用者/生产者系统的线程,您可以使用队列(数据结构)而不是消息系统。 (参见此处示例:C# producer/consumer)。

另一种可能的解决方案(我不建议)是:您可以使用GetThreadId返回给定本机线程的ID。然后你需要找到的是线程句柄并将其传递给该函数。 GetCurrentThreadId返回当前线程的ID。在那里你可以访问它的名字属性。

答案 2 :(得分:1)

想象一下,你经营一家公司,你可以雇佣尽可能多的员工,但每个员工都是一心一意,所以你只能给他们一个订单永远。你无法完成它们,对吧?因此,如果您是一位聪明的经理,那么您要做的就是"您的订单是在您的收件箱中等待,直到您收到一封信告诉您该做什么,做什么工作,然后重复& #39;&#34 ;.然后,当您需要完成工作时,您可以将工作项放入工作人员的收件箱中。

如果你给员工一个长期,低优先级的任务,那么问题就出现了(让我们说,#34;开车到Topeka为公司野餐采摘花生酱") 。员工很乐意去做那件事。但随后建筑物着火了,你需要知道如果你发出命令"抓住灭火器并把火扑灭!" 某人 会尽快做到这一点。您可以通过让多个员工共享一个收件箱来解决这个问题 - 这样,有人准备执行命令以扑灭火焰的可能性更高,而且不会开车经过堪萨斯州。

猜猜是什么?线程是那些困难的员工。

您不会将消息传递给线程"。您可以做的是设置一个线程或一组线程来观察一个共同的共享数据结构,例如阻塞队列(例如.NET中的BlockingCollection),然后将消息(如您​​的字符串)放入消费者线程处理的队列(需要在队列上监听工作)。

对于双向通信,您需要两个队列(一个用于消息,一个用于响应)。原因是你的"主要"线程也是一个坏员工 - 它只能一次处理一个响应,当它处理来自一个工作者的响应时,另一个工作者可能会回来另一个响应。您希望构建请求/响应协调协议,以便原始请求者知道响应与哪个请求相关联 - 通常请求具有ID,并且响应引用请求的ID,以便原始请求者知道请求每个响应的请求。

如果队列中没有内置到您正在使用的Producer / Consumer队列中,则需要对队列进行适当的线程同步(锁定)。想象一下,如果你把一条消息发送到一个工人的收件箱,那个工人非常渴望阅读这条消息,他从你的手中抓住了它并把它撕成两半。您需要的是能够防止多个线程一次访问队列。

答案 3 :(得分:0)

消息只是一个方法调用,要进行方法调用,首先需要一个实例对象,它暴露一些要调用的方法,因此向线程发送消息意味着找到存在于该线程中的活动对象并调用它具体方法。

查找每个线程的主要工作者对象可以通过线程协调器进行处理,因此如果特定线程中的对象想要向另一个对象发送消息(在其他对象中)线程),它首先将它的请求发送给线程协调器,协调器将消息/请求发送到它的目的地。