推送调度程序 - 如何管理线程c#

时间:2012-08-13 18:16:51

标签: c# multithreading

我有一个不断填充工作项的队列 这些项目需要及时处理 - 所以我们有许多不同的处理器等待接收正在处理的项目

这些子处理器中的每一个一次只能处理一组数据,并且需要将数据推送到它,所以这就是我考虑这样做的方式

首先是:

  1. 进程将项目插入队列
  2. 队列应该是唯一的 - 所以如果一个项目已经在队列中,则不应该重新插入(我现在不确定 - 但我可能需要提高此类项目的优先级,在这种情况下,队列可能不起作用)
  3. 我在想

    1. Dispatcher为每个可用处理器创建一个对象
    2. Start Loop:
    3. Dispatcher检查队列中是否有要处理的项目
    4. Dispatcher查找当前无法正常工作的处理器
    5. Dispatcher将工作项发送到空闲处理器
    6. 转到开始循环:
    7. 我的问题是,我如何管理处理器对象上的线程 我正在考虑做以下其中一项:

      1. 当一个Processor对象被调度程序发痒时 - 创建一个线程并开始处理它,当线程完成时让它死掉。 - 明显的缺点:创建并杀死一堆线程(线程池会缓解这个问题吗?)
      2. 为每个将执行其工作的处理器创建专用线程,然后检查处理器对象以查看是否还有其他工作要做 - 显而易见的缺点:50个处理器意味着50个线程,并且同步可能会变得困难< / LI>
      3. 可能有一种更简单的方法
      4. 谢谢 的修改

        我似乎一直不清楚 - 数据不必由所有处理器处理 它可以由任何处理器处理 - 但是一旦处理器开始处理数据,我们就不能发送任何新数据,直到它完成处理 - 同时新数据涌入队列,管理者需要尽快保持数据输出尽可能 -

        所以循环再次像这样

        1. Dispatcher查看是否有任何处理器可用且队列中有待处理的项目
        2. Dispatcher选择空闲处理器并从队列中弹出顶级数据并将其发送到该处理器进行处理
        3. 调度员等一会儿再次游泳
        4. 在处理器端 - 数据被发送到外部系统(一个有点长的过程)并且处理器等待外部系统返回并且它存储处理过的数据 - 只有那时处理器才可用于新的集合队列中的数据

1 个答案:

答案 0 :(得分:1)

我设法建立类似队列管理系统的最简单方法是在C#中使用内置的Queue对象。

public volatile Queue<MessageObject> q = new Queue<MessageObject>();

现在必须将消息发送到每个线程,如果您不想真正处理同步,请锁定并弹出顶部对象。您可以假脱机线程,或使用EventHandler。如果使用EventHandler,则需要在两个线程上进行同步,但它应该更快。

lock(q) { 
    this.nextcommand = q.Pop();
}