将多个任务分配给多个线程

时间:2019-01-28 05:16:29

标签: c# threadpool

我想同时进行多个 REST API 调用。 例如

我有一个REST API调用 CreateData()。我想在服务器中创建1000个数据,以适合4-5个并行线程中的多线程操作。

我是C ++开发人员,并且知道多线程如何在C ++中工作。我对C#编码非常幼稚。我了解异步任务,但不知道如何实现上述任务。

var response = await Task.Run(()=>CreateData());

现在,我按顺序进行操作,一旦收到以前的 CreateData()响应,我就一个个地在一个线程中创建数据。这会严重影响性能,并花费大量时间。

我想创建5个线程,这些线程将为所有1000个用户以并行方式进行REST API调用。

2 个答案:

答案 0 :(得分:5)

现在,您要为response的结果分配Task.Run,这在某些方面也需要Task才能完成。由于您正在使用关键字await,因此在编译时会自动发生这种情况。

如果愿意,可以将response分配给正在运行的Task本身并继续进行。当然,我不再将其称为response。假设您这样做,然后将其称为task1

var task1 = Task.Run(()=>CreateData());

现在,您的代码将继续运行,并且task1仅代表正在运行的Task

如果您有5个,则可以按照自己的想法来做。

var task1 = Task.Run(()=>CreateData());
var task2 = Task.Run(()=>CreateData());
var task3 = Task.Run(()=>CreateData());
var task4 = Task.Run(()=>CreateData());
var task5 = Task.Run(()=>CreateData());

现在,您还可以使用Task.WhenAll方法等待所有这些任务同时完成。

await Task.WhenAll(task1, task2, task3, task4, task5);

所以总结一下。

await关键字起到了一些编译器魔术的作用,并且基本上在方法的那个位置放置了一个回调(在Task完成时将方法的其余部分分配为继续操作),并且ALSO分配了Result中的Task到变量中(如果Task有结果)。这里有很多要解压的东西。我不相信一个简短的答案就能证明正在发生的事情。

无需使用await关键字,您只需将Task本身分配给变量。

答案 1 :(得分:2)

您可以参考此https://stackoverflow.com/a/25010220/4209924

OR

您可以执行以下操作。

    public async Task CreateData()
    {
        // your logic here with await
    }

    public async Task GetData()
    {
        var data1 = CreateData();
        var data2 = CreateData();
        var data3 = CreateData();
        var data4 = CreateData();
        await Task.WhenAll(new Task[] { data1, data2, data3, data4 });
    }