multithreading - 如何在 C# 4.0 中实现任务延续

标签 multithreading c#-4.0 task-parallel-library task continuations

我有一组要初始化的模块,其中 3 个模块需要很长时间,而其他模块需要很少的时间来初始化。目前,如果将所有这些都放在同一个线程上,则需要很长时间,例如

foreach (var m in modules)
{
     var md = m;
     md.Initialise();
}

所以我正在尝试类似的东西
foreach (var m in modules)
{
    Task.Factory.StartNew(()=>{
                                      var md = m;
                                      md.Initialise();
                              }, TaskCreationOptions.Longrunning);

}

也试过:
Parallel.ForEach(modules, m => m.Initialize());

这些都不起作用,因为它不会等待所有模块被初始化。
我需要在 UI 线程可以继续之前初始化所有模块,否则 UI 将在第一个模块初始化后很快启动,并且由于其他模块仍未初始化,UI 变为空壳。有什么方法可以实现在单独线程上初始化的每个模块,并且主线程将等到它们全部初始化?希望我已经说清楚了。
谢谢。

最佳答案

你可以做你的foreach在平行下:

Parallel.ForEach(modules, m => m.Initialize());

关于multithreading - 如何在 C# 4.0 中实现任务延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26159484/

相关文章:

.net - 使用 .net 连接器连接 Couchbase 服务器时出现异常

c# - 任务结果到一个列表中

.net - Task.Delay 在 .NET 4 中没有记录吗?

没有 jstack 的 Java 线程转储

c# - 为什么在调用的方法中使用 ThreadStaticAttribute 字段而不是局部变量?

mysql - 如何使用 Sidekiq 防止 "Mysql2::Error: This connection is in use by"

javascript - 如何在占位符中动态添加用户控件而不删除占位符中添加的所有控件?

.net - RabbitMQ Pub/Sub : Closing the last consumer closes the publisher's channel/model. 为什么?

c# - 从特定线程调用方法

c - 在 C 中使用 PThreads 合并排序