在控制台应用程序中的不同线程中运行任务

时间:2013-06-03 22:25:03

标签: c# multithreading asynchronous

我对此做了很多研究,但我似乎仍然无法做到这一点。我必须生成一个包含1000页的pdf文件(我使用一个库),需要为不同的数据执行N次。数据是相互独立的,我可以完全并行生成这个,这正是我想要做的。理想情况下,我希望在10个线程中完成此操作,每个线程在内存中生成pdf并在结束时保存它。假设每个pdf需要15分钟(1000页),如果按顺序执行此操作,那么对于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。

2 个答案:

答案 0 :(得分:9)

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 });

答案 1 :(得分:0)

如果你认为你知道你想要多少线程,你应该继续使用线程。只需启动所有这些线程,然后等待所有这些线程完成。