在控制台应用程序的不同线程中运行任务
本文关键字:线程 运行 任务 控制台 应用程序 | 更新日期: 2023-09-27 18:16:42
我对此做了相当多的研究,但我似乎仍然不能得到它的权利。我必须生成一个有1000页的pdf文件(我使用一个库),需要为不同的数据做N次。这些数据是相互独立的我完全可以并行生成,这就是我要做的。理想情况下,我想在10个线程中完成这项工作,每个线程在内存中生成pdf并在最后保存它。假设每个pdf(1000页)需要15分钟,如果我按顺序这样做,那么10个pdf文件需要150分钟,而如果我使用10个线程,则需要30分钟。我知道人们不太喜欢线程,但是我怎样才能加快线程的速度呢?
我正在看ThreadPool
,但后来我在4.0中看到了这个新的Task
。我读到,如果我使用TaskCreationOptions.LongRunning
,我可以强迫每个任务在一个单独的线程中运行,但这似乎不适合我。我试图使用ThreadPool
太,但由于每个PDF是从一个url生成的,出于某种原因,WebRequest.Create(url)
方法似乎不执行时,从线程池调用?但是我想我更愿意让新的任务库工作。
这是我现在所拥有的,但它似乎仍然按顺序执行。
Task myTask= Task.Factory.StartNew(() =>
{
//code for the task.
//get html content
//generate pdf file.
}
}, new CancellationToken(false), TaskCreationOptions.LongRunning, TaskScheduler.Default);
myTask.Wait();
我在这里做错了什么?如果你有什么建议,请告诉我。我现在不能超过。net 4.0
myTask.Wait()
使您的控制线程的执行暂停,直到任务完成…您不希望在启动其中一个任务后立即停止执行。
你要做的是一次创建多个任务,启动它们,然后调用Task.WaitAll(array)
等待它们全部完成,而不是一次等待一个。
// Define your tasks and start them all
var task1 = Task.Factory.StartNew(() => { /*do something*/ });
var task2 = Task.Factory.StartNew(() => { /*do something*/ });
var task3 = Task.Factory.StartNew(() => { /*do something*/ });
// Wait for ALL tasks to finish
// Control will block here until all 3 finish in parallel
Task.WaitAll(new[] { task1, task2, task3 });
如果您认为您知道需要多少线程,那么您应该继续使用线程。只要启动所有这些线程,然后等待它们全部完成。