【问题标题】:How to achieve task continuation in c# 4.0如何在 C# 4.0 中实现任务延续
【发布时间】:2014-11-27 08:42:56
【问题描述】:

我有一组要初始化的模块,其中 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 变为空壳。有什么方法可以实现在单独线程上初始化的每个模块,并且主线程将等到它们全部初始化?希望我已经说清楚了。 谢谢。

【问题讨论】:

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


    【解决方案1】:

    您可以并行处理foreach

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

    【讨论】:

    • 抱歉忘了提我已经尝试过了,但没有成功。我认为 Parallel.ForEach 在这种情况下不会继续,即如果一个模块需要 1 秒来初始化,而另一个模块需要 10 秒来初始化,那么主线程只会“暂停”1 秒而不是 10 秒。
    • @stt106 这不是真的。 Parallel.ForEach 阻塞,直到所有项目都处理完毕。也许您错误地尝试将Parallel.ForEachTask.Factory.StartNew 一起使用?
    • @YuvalItzchakov 对不起,你是对的。尽管没有同时使用并行和任务,但我正在做一些愚蠢的事情。我认为这回答了我提出的问题,虽然它并没有完全解决我的问题,但我想现在的问题与并行性无关,所以我将其标记为正确答案。
    猜你喜欢
    • 2010-09-05
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多