Task.Factory.StartNew () завершается ошибкой, когда две задачи запускаются очень быстро - PullRequest
0 голосов
/ 19 апреля 2019

При запуске двух задач одновременно (или почти одновременно) с Task.Factory.StartNew () одна из них всегда завершается немедленно.

У меня есть функция, которая создает задачу из основного потока, которая затем сама запускает некоторое количество задач в зависимости от количества параллельных заданий, которые необходимо выполнить. В частности, у меня есть приложение, которое выполняет сканирование на количество компьютеров «x» удаленно, и каждое задание на сканирование может иметь «y» количество определений отдельных заданий на сканирование, которые нужно запускать одно за другим. Фактическое сканирование выполняется отдельной командной строкой exe. При попытке запуска на двух компьютерах при первом сканировании первого компьютера окно командной строки появляется на долю секунды, а затем сразу же закрывается, а остальная часть процесса продолжается, как и предполагалось. Я перепробовал множество вариантов одного и того же кода, и единственное надежное исправление - это добавление Thread.Sleep () в цикл foreach, что делает его работоспособным.

Рабочий код выглядит примерно так:

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 () решает проблему?

...