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

Assigning multiple tasks to to multiple thread

我有多个 REST API 调用,我想以并行方式进行。 例如

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

我是 C++ 开发人员并且知道多线程在 C++ 中是如何工作的。我对 C# 编码很天真。我知道异步任务,但不知道如何实现上述任务。

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

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

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

可以参考这个

你可以这样做。

    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 });
    }

现在您正在将 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将 TaskResult 分配给变量(如果 Task 有结果)。这里有很多东西要打开;我不相信一个简短的回答真的证明了正在发生的事情。

如果不使用 await 关键字,那么您只需将 Task 本身分配给变量即可。