我有多个REST 调用,我想以并行方式进行。例如。
我有一个REST调用CreateData()。我想要在服务器上创建1000个数据,它适用于4-5并行线程中的多线程操作。
我是C++开发人员,知道C++中多线程是如何工作的。我在C#编码方面很幼稚。我知道异步任务,但不知道如何完成上述任务。
var response = await Task.Run(()=>CreateData());现在,我正在按顺序执行该操作,一旦收到以前的CreateData()的响应,就会一个一个地在一个线程中创建数据。它严重影响了业绩,花了很多时间。
我想要创建5个线程,它将以并行方式对所有1000个用户执行REST调用。
发布于 2019-01-28 05:33:17
现在,您将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完成时将方法的其余部分指定为延续),并将该Task的Result分配给变量(如果Task有结果的话)。这里有很多东西要打开,我不相信一个简短的答案真的能证明所发生的一切是正确的。
不使用await关键字,那么只需将Task本身分配给变量。
发布于 2019-01-28 05:32:00
您可以参考这个https://stackoverflow.com/a/25010220/4209924
或
你可以做这样的事。
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 });
}https://stackoverflow.com/questions/54395904
复制相似问题