我有一个引擎,其中包含任意数量的轮询程序,每个程序每隔几秒钟进行一次“轮询”。我希望各个轮询程序在不同的线程中运行,但单个轮询程序内的每个“轮询”都应该是顺序执行的,以便一个在另一个之后发生。使用以下代码启动轮询过程,一切都可以正常工作:
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个poller的测试,一切正常。如果我创建4个以上,就会遇到奇怪的行为。其中三个poller可以工作,其中一个只执行了一次轮询,剩下的则根本不会轮询。 我的任务需要长时间运行是有道理的,毕竟它们在整个程序中都在运行。但我不明白为什么没有设置此选项会出现一些不良行为。希望能得到任何帮助。