我想同时进行多个 REST API 调用。 例如
我有一个REST API调用 CreateData()。我想在服务器中创建1000个数据,以适合4-5个并行线程中的多线程操作。
我是C ++开发人员,并且知道多线程如何在C ++中工作。我对C#编码非常幼稚。我了解异步任务,但不知道如何实现上述任务。
var response = await Task.Run(()=>CreateData());
现在,我按顺序进行操作,一旦收到以前的 CreateData()响应,我就一个个地在一个线程中创建数据。这会严重影响性能,并花费大量时间。
我想创建5个线程,这些线程将为所有1000个用户以并行方式进行REST API调用。
答案 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 });
}