2012-03-08 34 views
1

在我的应用程序中,我有一组插件 - 在应用程序中发生某些事件时执行一些小操作的类。插件的每个方法都必须在单独的线程中调用,但每个插件只能同时运行一个方法。我们应该使用自己的线程还是线程池来处理小而频繁的任务?

我可以实现这个使用两种方法:

  1. 为每个插件将处理来自插件的队列中的事件,直到队列为空创建一个线程。然后睡觉,直到新事件排队,处理它等等。

  2. 当事件来到插件的队列时,它在线程池线程中进行处理。当队列变空时,将其释放回线程池。

问题是:这两种方式的优缺点是什么?

一些澄清:

  • 插件不加载CPU太多,大部分时间他们只是等待下一个事件。
  • 我不在乎创建线程所需的时间,插件是长期生活的。
  • 通常我有〜10-20个这样的插件,每个应用程序。
+0

“尽管每个插件只能同时运行一种方法” - 您是否认为对于给定的插件,您不能同时调用两种方法?但是,如果你有单独的插件,你可以同时在这些不同的插件上执行方法? – RandomEngy 2012-03-08 22:41:14

+0

是的,正是...... – 2012-03-09 21:30:42

回答

2

一个插件中的每一个方法必须在单独的线程中调用,虽然只有一个各插件的方法可以同时运行。

如果这是您的要求,我会考虑围绕BlockingCollection<T>构建插件。当你添加一个插件时,开始一个长时间运行的任务,只需foreachBlockingCollection.GetConsumingEnumerable()

这将允许您将项目添加到他们的“队列”,并且该插件将按顺序自动处理这些项目,而不需要您自己的“睡眠”处理。每个插件只能使用blockingCollection.GetConsumingEnumerable来处理其队列中的项目。

1

我已经看到它的两种方式。每个插件有一个线程会变得很丑陋 - 你开始依赖“只有一个线程触及我的插件”的想法,然后有人在一个插件的线程去触及其他插件的时候出错了(尽管复杂的事件处理或类似的东西)。那么你最终会遇到非常难以跟踪的比赛条件。

@ Reed-Copsey建议的方法要简洁得多,但如果您必须使用您提到的两种方法之一,那么使用线程池并适当地锁定会稍后为您节省一些心痛。如果您有多个团队成员在项目的多个方面工作,这尤其适用。

1

我会去#2。原因是你没有围绕一堆大部分时间处于空闲状态的线程。这样做确实没有缺点,因为您也可以在不同的插件和每个给定插件的顺序执行之间获得并行性。

相关问题