繁体   English   中英

并行执行一对任务

[英]execute pair of tasks in Parallel

有两个执行On / Off的任务,我想创建这些(对)的列表并并行执行。 含义: 每个Task封装TaskA和TaskB - TaskB始终等待TaskA首先完成 因此,我应该最终并行执行TaskA / TaskB的“设置”

Task = {TaskA,TaskB},{TaskA,TaskB},{TaskA,TaskB}:并行执行这3组任务

    private static async Task TaskA()
    {
        await Task.Delay(2000);
        Console.WriteLine("ended TaskA");
    }

    private static async Task TaskB()
    {
        await Task.Delay(2000);
        Console.WriteLine("ended TaskB");
    }

    static void StartTask()
    {
        Task.Run(() =>
        {
            TaskA().Wait();
            TaskB().Wait();
        });
    }

主要:

        List<Task> tasks = new List<Task>();
        int taskCount = 3;

        for (var i = 0; i < taskCount; i++)
        {
            var task = new Task(StartTask);
            tasks.Add(task);
        }

        Parallel.ForEach(tasks, task => task.Start());

目前,我得到这个:

ended TaskA
ended TaskA
ended TaskA
ended TaskB
ended TaskB
ended TaskB

我相信输出应该是:

ended TaskA
ended TaskB
ended TaskA
ended TaskB
// etc..

此外,尝试了此,但仍然是相同的问题:

static void StartTask()
{
    Task task = TaskA().ContinueWith(x => TaskB().Wait(), TaskContinuationOptions.OnlyOnRanToCompletion);
}

编辑1:

    Parallel.For(1, taskCount, (i, state) =>
    {
        TaskA().ContinueWith(x => TaskB().Wait(), TaskContinuationOptions.OnlyOnRanToCompletion);
    });

我相信输出应该是:...

不,那不是“平行”的意思。 如果您打算开始三对,那么我希望您已经看到了输出。

就是说,代码中有些东西没有意义。 首先,区分“并行”(多个线程)和“并行”(同时执行多个操作)。 看起来您的任务自然是异步的,因此让我们使用异步编程而不是线程来重写代码:

  • Wait替换为await
  • 摆脱Task.Run

TaskATaskB成一个新的“配对任务”会更容易:

static async Task PairTaskAsync()
{
  await TaskA();
  await TaskB();
}

现在,您只想同时运行其中的三个“配对任务”。 旧代码使用任务构造函数,然后并行化启动任务-即使我们进行并行化,这也是完全错误的。 我们不 我们想要异步并发。

异步并发通常通过Task.WhenAll实现:

List<Task> tasks = new List<Task>();
int taskCount = 3;

for (var i = 0; i < taskCount; i++)
  tasks.Add(PairTaskAsync());

await Task.WhenAll(tasks);

或者,为了最大程度地简洁:

await Task.WhenAll(Enumerable.Range(0, 3).Select(_ => PairTaskAsync()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM