快速启动两个任务时Task.Factory.StartNew()失败

时间:2019-04-19 19:00:03

标签: c# task-parallel-library

使用Task.Factory.StartNew()同时(或几乎同时)启动两个任务时,其中之一总是立即退出。

我有一个从主线程创建任务的函数,然后该线程根据需要完成的并行作业的数量本身启动一些任务。更具体地说,我有一个应用程序,可以对“ x”台计算机进行远程扫描,每个扫描作业可以具有“ y”台数的单个扫描作业定义,这些定义需要一个接一个地运行。实际的扫描是通过单独的命令行exe完成的。当尝试在两台计算机上启动时,对第一台计算机的第一次扫描会在命令行窗口弹出一秒钟,然后立即关闭,而其余过程将按预期进行。我已经尝试过相同代码的许多变体,唯一可靠的解决方法是在foreach循环内扔一个Thread.Sleep(),使其工作正常。

正在运行的代码如下:

private void StartClicked(object sender, MouseButtonEventArgs e)
{
    // Gather information about the job here

    Task.Factory.StartNew(() => RunJobs(listOfJobs), TaskCreationOptions.LongRunning)

    // Do some other stuff while tasks run.
}

private void RunJobs(Queue<Job> p_jobs)
{
    while (p_jobs.Any())
    {
        var job = p_jobs.Dequeue();
        Task.Factory.StartNew(() => BeginScan(job), TaskCreationOptions.LongRunning);
        // Adding Thread.Sleep(someNumber) here fixes the issue, but I don't want to rely on that.
    }
}

private void BeginScan(Job p_job)
{
    foreach(var scanPolicy in p_job.PoliciesForExecution)
    {
        PolicyScan(scanPolicy);
    }
}

private void PolicyScan(Policy p_policy)
{
    // Launch exe with some parameters here.
}

这是怎么回事?为什么添加手动Thread.Sleep()可以解决此问题?

0 个答案:

没有答案