- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对此做了很多研究,但我似乎仍然无法做到正确。我必须生成一个 1000 页的 pdf 文件(我使用一个库),并且需要对不同的数据执行 N 次。数据是相互独立的,我可以完全并行生成它,这就是我想要做的。理想情况下,我希望在 10 个线程中完成此操作,每个线程在内存中生成 pdf 并在最后保存它。假设每个 pdf 文件(1000 页)需要 15 分钟,如果我按顺序执行此操作,则 10 个 pdf 文件需要 150 分钟,而如果使用 10 个线程则需要 30 分钟。我知道人们不太喜欢线程,但是我怎样才能加快速度呢?
我正在查看ThreadPool
,但后来我在 4.0 中看到了这个新的Task
。我读到,如果我使用 TaskCreationOptions.LongRunning,我可以强制每个任务在单独的线程中运行,但这似乎对我不起作用。我也尝试使用 ThreadPool,但由于每个 PDF 都是从 url 生成的,并且由于某种原因,当从 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 });
关于c# - 在控制台应用程序的不同线程中运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906832/
我是一名优秀的程序员,十分优秀!