我有一个c#单线程应用程序,目前正在使用线程池使其多线程。我被困在决定哪种模式能解决我的问题上。
这是我目前的情况
While(1)
{
do_sometask();
wait(time);
}这几乎是永远重复的。新场景具有多个线程,执行上述操作。我可以通过根据我必须执行的任务生成多个线程来轻松地实现它,在这些任务中,所有线程都执行一些任务并永远等待。
这里的问题是我可能不知道任务的数量,所以我不能盲目地生成500个线程。我考虑过使用线程池,但是由于几乎每个线程都会永远循环,并且永远不会被队列中的新任务释放,所以不确定使用哪个其他模型。
我正在寻找一种想法或解决方案,可以在线程中断开循环并释放它而不是等待,但是在等待之后返回并继续执行相同的任务(当时间过去时,使用类似于计时器/检查最后一次任务执行时间的时间戳)。
这样,我就可以使用有限数量的线程(如线程池中的线程),并为旧线程等待(实际上)期间的任务提供服务。
任何帮助都是非常感谢的。
发布于 2015-01-25 10:44:01
在将其添加到线程池队列之前,我可以借助线程池和很少的条件来实现它,以检查任务的最后一个活动。
发布于 2015-01-22 19:19:25
如果你拥有的只是一堆周期性发生的事情,听起来你想要的是一堆计时器。为每个任务创建一个定时器,以便在适当时触发。因此,如果您有两个不同的任务:
using System.Threading;
// Task1 happens once per minute
Timer task1Timer = new Timer(
s => DoTask1(),
null,
TimeSpan.FromMinutes(1),
TimeSpan.FromMinutes(1));
// Task2 happens once every 47 seconds
Timer task2Timer = new Timer(
s => DoTask2(),
null,
TimeSpan.FromSeconds(47),
TimeSpan.FromSeconds(47);计时器是一个非常轻量级的对象,所以拥有大量的计时器并不是什么问题。计时器只在触发时才使用CPU资源。回调方法将在池线程上执行。
有一个潜在的问题。如果您有大量的计时器--所有时间都是相同的--那么回调将同时被调用。线程池应该通过限制并发任务的数量来优雅地处理这个问题,但我不能肯定。但如果你的等待时间是错开的,这会很好。
如果您的等待时间很短(不到一秒钟),那么您可能需要一种不同的技术。如果需要的话我会详细说明的。
发布于 2015-01-22 19:34:06
使用此设计,在任何时候只有一个线程被阻塞。
让一个线程(主线程)等待并发阻塞集合,例如BlockingCollection。这个线程将被对TryTake的调用所阻塞,直到某个东西被放置在集合中,或者在经过一段时间之后通过传递到调用中的超时(稍后会有更多的内容)。
一旦解除阻塞,它可能有一个工作单位要处理。它检查是否有一个线程(即TryTake调用没有超时),如果有执行此工作的能力,如果有,则排队一个线程(池、任务或诸如此类)来服务该工作。然后,这个主线程返回到阻塞集合,并尝试采取另一个工作单元。循环还在继续。
当一个单位的工作开始,它将被注意到,使主线程可以看到有多少线程工作。一旦此单元完成,符号将被移除。然后释放线程。
您希望使用超时,以便如果判断有太多的操作同时运行,那么您将能够重新评估这一段时间。否则,该工作单元位于阻塞集合中,直到添加一个新的单元,这不是最优的。
此实例的外部用户可以通过简单地将新的工作单元放到集合中来排队。
当关闭操作时,您可以使用取消令牌立即解除阻塞线程。让员工操作也采取取消令牌,以便他们可以停止关闭。
https://stackoverflow.com/questions/28096783
复制相似问题