线程体系结构问题中的事件处理

时间:2010-09-20 19:50:59

标签: c# architecture network-programming multithreading

我正在处理多线程架构设计缺陷的大局面。我试图保持我的应用程序完全线程安全,避免彼此冲突。

我知道的问题是:

假设有两个主题,主题A 主题B

线程A 是您从Static Void Main方法中看到的唯一线程。

线程A 创建一个具有Start / Stop异步方法的对象,并将事件处理应用于该对象。

当从线程A 在对象中调用Start方法时,它会为该对象创建一个新线程,以处理来自对象属性或输入的信息线程B 。 (就我而言,我自己的协议中的网络接收和发送过程。)

线程B 中的对象在从输入或属性接收新信息时完成时,线程B 调用对象中的事件以将数据传递给主题A

问题是,当调用事件时,它由线程B 管理。假设线程B 仅在该对象上运行以继续执行处理方法,而是转到另一个对象,然后在线程A 之间发生交叉线程冲突线程B ,当假设将事件传递给线程A 单独线程A 来处理该新输出时。

如果线程A 是初始化对象及其运行的类的那个,那么为什么调用该事件时,它会在线程B 上运行?

我需要线程B 继续循环,不要通过将事件信息传递给线程A 来中断程序。

请原谅我的英语和语法,谢谢你的耐心等待。 : - )

[编辑x4] 如果你想获得源代码,它就在这里:http://fcpfoundation.codeplex.com/(现在已经开始了。)

您可以在上面的链接中找到源代码。如果我的解释不清楚,我很抱歉。我无法制作示例代码的原因是它太大了。

2 个答案:

答案 0 :(得分:2)

默认情况下,将在触发回调的线程中发生回调(线程B)。那是因为没有一种正确的方法让线程B告诉线程A它有什么东西可以执行。毕竟,线程A什么时候应该执行呢?你不希望线程B实际上中断线程A,因为它可能忙于做一些重要事情并且中断它可能使程序处于无效状态以运行线程B提供的代码。想象一下发生了以下情况:

  • 线程A要求线程B在X发生时告诉它。
  • 线程A开始排序重要信息列表。
  • 线程B告诉线程A停止它正在做什么,因为X已经发生。
  • 线程A开始响应X,但它处于排序中间,因此列表处于无效状态,导致处理X时出现问题。

为了让线程A基于X做某事,它需要到达一个安全的地方,在那里它不忙于做其他事情。在应用程序的主UI线程中,这发生在所谓的消息泵中,其中Windows正在给应用程序消息,例如“请自己画画”或“鼠标刚刚移动”。您可以使用消息泵发布自己的消息,使用Control.Invoke来安排一些代码在UI线程上执行。

如果线程A不是UI线程,那么你需要自己设计线程A如何从线程B获取消息并在其自己的时间处理它。

答案 1 :(得分:0)

也许这过于简单化了问题,但您是否考虑过某种线程安全的FIFO消息泵?即,线程B可以将事件通知发布到线程A监视的FIFO队列。由于它是“火与忘记”,线程B可以发布并继续前进,而不是关心线程A正在做什么。然后,线程A可以根据需要监视并将消息拉出队列。

System.Collections.Queue或System.Collections.Generic.Queue的公共静态实例都是线程安全的。