【问题标题】:Modeling: Parallel Queue with dependencies建模:具有依赖关系的并行队列
【发布时间】:2017-01-05 12:42:52
【问题描述】:

我有一个相当复杂的设置,需要一些输入来解决它。

我有一个由任务 1、2a、2b、2c、3a、3b、3c 和 4 组成的进程 A。

任务 1 必须首先运行,并且没有其他任务并行运行。

任务 2a,2b,2c 必须一个接一个运行,但可以与 3a,3b,3c 并行执行(也必须一个接一个运行。任务 4 只能在 3c 和 2c 完成后运行.

我首先通过 Priority Queue 实现了这一点,并尝试使用 Priorities 和一种机制来管理它,该机制仅使一种类型的出队,这意味着 2a 和 3a 可以同时出队,2b 和 3b 等等。

但是如果 3a 完成并且可以开始 3b,它必须等到 2a 也完成。我需要一个队列机制的想法,它可以以某种方式处理我的情况。我知道这很复杂,但任何提示都可能对我有所帮助。

【问题讨论】:

标签: c# parallel-processing queue


【解决方案1】:

使用asyncawait,您的解决方案将如下所示(假设您有方法Run...Async 来运行您的各个任务并返回任务):

async Task RunTasks2Async() {
     await RunTask2aAsync();
     await RunTask2bAsync();
     await RunTask2cAsync();
}

async Task RunTasks3Async() {
     await RunTask3aAsync();
     await RunTask3bAsync();
     await RunTask3cAsync();
}

async Task RunAllTasks()
{
    await RunTask1();
    Task task2 = RunTasks2Async();
    Task task3 = RunTasks3Async();
    await Task.WhenAll(task2, task3);
    await RunTask4Async();
}

如果你不想使用async/await,你可以使用Task.ContinueWith来串行执行你的任务,Task.WhenAll来并行执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2011-06-21
    • 2015-11-02
    • 2020-05-20
    • 2015-12-28
    • 2011-04-14
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多