C#学习教程:不使用TaskCreationOptions.LongRunning时的奇怪行为我希望轮询器在不同的线程中运行,但是单个轮询器中的每个“轮询”应该是顺序的,以便它发生在下一个轮询器之后。一切都在使用以下代码启动轮询过程:publicvoidStartPolling(){Stopwatchwatch=newStopwatch();while(Engine.IsRunning){Tasktask=Task.Factory.StartNew(()=>{watch.Restart();Poll();watch.Stop();},TaskCreationOptions.LongRunning);任务.等待();如果(频率>watch.Elapsed)Thread.Sleep(频率-watch.Elapsed);然而,我花了一段时间才发现TaskCreationOptions.LongRunning选项,它解决了我遇到的一个我仍然不明白的奇怪问题。没有这个选项,如果我运行一个测试来创建1-3个这样的轮询器,一切都正常。如果我创建4+,那么我会遇到奇怪的行为。三个轮询器工作,一个只进行一次轮询,其余轮询器不进行轮询。一般来说,我的任务是长期运行的。毕竟他们正在运行我的整个程序。但我不明白为什么我在没有设置此选项的情况下会出现一些不良行为。任何帮助将不胜感激。当您不使用LongRunning标志时,任务将安排在线程LongRunning线程上,而不是在它自己的(专用)线程上。这可能是您的行为发生变化的原因-当您在没有LongRunning标志的情况下运行时,您可能会由于进程中的其他线程而遇到线程LongRunning饥饿。话虽如此,您上面的代码并没有多大意义。您正在启动一个专用线程(通过Task...StartNew和LongRunning)来启动任务,然后立即调用task.Wait()来阻止当前线程。最好在当前线程中按顺序执行此操作:publicvoidStartPolling(){Stopwatchwatch=newStopwatch();while(Engine.IsRunning){watch.Restart();轮询();观看。停止();如果(频率>watch.Elapsed)Thread.Sleep(频率-watch.Elapsed);TPL(和传统的ThreadPool)限制线程池中的线程数(通常是CPU内核数的一小部分,通常是2x内核)。如果任务被标记为LongRunning,它知道任务不会很快完成,并且可能不会将此任务放在LongRunning的线程限制上。如果没有LongRunning,它会假设您的任务会很快完成(实际上并没有),因此它会保持在线程限制内。然后,如果您创建的任务多于线程限制并且正在运行的任务永远不会结束,则TPL会阻止所有其他任务运行,等待这些正在运行的任务完成(它们永远不会这样做)。以上是C#学习教程:当我不使用TaskCreationOptions时。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
