首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >推送分配器-如何管理线程c#

推送分配器-如何管理线程c#
EN

Stack Overflow用户
提问于 2012-08-13 18:16:50
回答 1查看 352关注 0票数 1

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

每个子处理器一次只能处理一组数据,需要将数据推送到它,所以我就是这么想的。

它从以下方面开始:

  1. 进程将项插入队列中。
  2. 队列应该是唯一的--因此,如果一个项已经在队列中,就不应该重新插入它(我目前还不确定--但我可能需要提高该项的优先级,在这种情况下,队列可能无法工作)

我在想

  1. Dispatcher为每个可用的处理器创建一个对象。
  2. 开始循环:
  3. 调度程序检查队列中是否有要处理的项。
  4. Dispatcher寻找当前无法工作的处理器。
  5. Dispatcher将工作项发送给空闲处理器
  6. Goto Start循环:

我的问题是,如何管理处理器对象上的线程,我正在考虑执行以下操作之一:

  1. 当一个处理器对象被调度程序挠痒时--创建一个线程并开始对它进行处理,当线程完成时,它就会死掉。-显而易见的问题:创建和杀死一堆线程(线程池会缓解这个问题吗?)
  2. 为每个处理器创建一个将完成其工作的专用线程,然后检查处理器对象以确定它是否还有更多的工作要做--显而易见的Cons: 50个处理器意味着50个线程,而同步可能会变得困难。
  3. 也许有一种更简单的方法

谢谢编辑

我似乎不清楚--数据不必由所有处理器处理--任何处理器都可以处理--然而,一旦处理器开始处理数据,我们就不能在它完成处理之前发送任何新的数据--同时,新的数据正涌入队列,管理人员需要尽可能快地分发数据--

所以循环又是这样的

  1. Dispatcher查找是否有可用的处理器,队列中是否有要处理的项。
  2. Dispatcher选择一个空闲处理器并弹出队列中的顶级数据,并将其发送给该处理器进行处理。
  3. 调度员等待一点点,然后再次池。

在处理器端,数据被发送到外部系统(一个稍微宽松的进程),处理器等待外部系统返回并存储处理过的数据,只有这样,处理器才可用,除了队列中的一组新的数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-13 18:37:28

最简单的方法是使用C#中的内置队列对象来实现类似的队列管理系统。

代码语言:javascript
代码运行次数:0
运行
复制
public volatile Queue<MessageObject> q = new Queue<MessageObject>();

现在必须将消息发送到每个线程,如果您不想真正处理同步,那么锁定并弹出顶部的对象。您可以对线程进行后台处理,也可以使用EventHandler。如果使用EventHandler,则需要在两个线程上同步,但速度应该更快。

代码语言:javascript
代码运行次数:0
运行
复制
lock(q) { 
    this.nextcommand = q.Pop();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11939987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档