【发布时间】:2017-05-23 22:27:10
【问题描述】:
我是 .NET 中所有并行编程范例的新手,我想知道两件事:
- 如何等待我的所有任务完成运行而不冻结我的主窗体。
- 我解决以下问题的方法是最好的方法吗?
我有一个 private async Task RunTask(string task) 方法,我需要运行与我拥有的任务数量一样多的次数。
在private async void button_click(object sender, EventArgs e) 类中,我有一个名为tasklist 的字符串列表,它初始化我需要运行的任务。我正在运行以下代码:
Thread thread = new Thread(()=> Parallel.ForEach(tasklist, t => RunTask(t)));
thread.Start();
RunOnCompletionOfTasks();
我需要能够利用我所有的 CPU 内核并在尽可能短的时间内运行所有任务。我认为Parallel.ForEach 是实现这一目标的最佳方法,但我的任务也是async,因为它们具有需要等待其他方法的功能。我的任务还在执行期间将一个字符串附加到类中的List<string> 对象。
Parallel.ForEach 导致我的 Windows 窗体冻结,因此我将其封装在一个线程中。问题在于 RunOnComlpetionOfTasks(); 在我的任务完成之前运行。
在不冻结 Windows 窗体的情况下,运行所有 RunTask 任务并在完成后运行 RunOnCompletionOfTasks 的最有效方法是什么?
请,谢谢。
【问题讨论】:
-
我想你在找
await Task.WhenAll
标签: c# .net multithreading parallel-processing