奇怪的行为当我不使用TaskCreationOptions.LongRunning

我有了轮询每个做他们的“民意调查”每隔几秒钟的任意数量的引擎。 我想轮询器在不同的线程运行,但因此后下一个发生的每一个“民意调查”一个轮询内应该是连续的。 一切工作正常使用此代码开始投票过程:

public void StartPolling() { Stopwatch watch = new Stopwatch(); while (Engine.IsRunning) { Task task = Task.Factory.StartNew(() =>{ watch.Restart(); Poll(); watch.Stop(); },TaskCreationOptions.LongRunning); task.Wait(); if(Frequency > watch.Elapsed) Thread.Sleep(Frequency - watch.Elapsed); } }

我花了一段时间,但是,发现哪些解决我有,我还是不明白,一个奇怪的问题TaskCreationOptions.LongRunning选项。 如果没有这个选项,如果我运行创建这些轮询1-3的测试,一切正常。 如果我创建4+然后我遇到了奇怪的行为。 轮询器的三会的工作,一会只执行一次民意调查中,和所有其他的都不会轮询。 这非常有意义,我的任务是长时间运行。 他们毕竟运行我的​​程序的整个长度。 但我不明白为什么我会得到一些不好的行为,而该选项集。 任何帮助,将不胜感激。

--------------解决方案-------------

当你不使用LongRunning标志,任务计划在线程池线程,而不是它自己的(专用)线程。 这可能是你的行为变化的原因-当你没有运行LongRunning标志的地方,你可能得到线程池饥饿由于在过程中的其他线程。

话虽这么说,你上面的代码并没有真正有很大的意义。 你开始一个专门的线程(通过任务.... StartNew与LongRunning)开始一个任务,然后立即调用task.Wait()以阻止当前线程。 这将是更好的只是做这个顺序在当前线程:

public void StartPolling()
{
Stopwatch watch = new Stopwatch();
while (Engine.IsRunning)
{
watch.Restart();
Poll();
watch.Stop();
if(Frequency > watch.Elapsed) Thread.Sleep(Frequency - watch.Elapsed);
}
}

TPL(与传统线程池)限制在池中的线​​程数(通常为CPU核心,通常2倍的核心数的小倍数)。 如果任务标记为LongRunning ,它知道任务不会很快完成,可能不会受到此任务线程限制。

如果没有LongRunning ,假设你的任务将快速完成(它没有),所以它保持中的线程限制。 然后,如果你创造更多的任务比线程限制和正在运行的任务永远不会结束,TPL停止运行等待所有其他任务白白为这些正在运行的任务完成(这是他们永远不会做)。

分类:C# 时间:2012-08-27 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.763 (s). 10 q(s)