我有一个具有任意数量轮询器的引擎,每个轮询器每隔几秒钟就会执行一次“轮询”。我希望轮询程序在不同的线程中运行,但是单个轮询程序中的每个“轮询”都应该是顺序的,以便在下一个轮询之后进行。使用此代码开始轮询过程,所有工作都在进行:

    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标志的情况下运行时,由于进程中的其他线程,您可能会导致线程池不足。

话虽如此,您上面的代码并没有多大意义。您正在启动一个专用线程(通过带有LongRunning的Task .... StartNew)来启动任务,然后立即调用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);
    }
}

关于c# - 不使用TaskCreationOptions.LongRunning时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5295265/

10-11 01:20