使用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()可以解决此问题?