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

Md.*_*tar 2 c# threadpool

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

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

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

var response = await Task.Run(()=>CreateData());
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_* II 5

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

如果您愿意,您可以分配responseTask自己运行并继续前进.当然我不会再打电话response了.让我们说你这样做并task1改为称呼它.

var task1 = Task.Run(()=>CreateData());
Run Code Online (Sandbox Code Playgroud)

现在你的代码将继续运行,并且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());
Run Code Online (Sandbox Code Playgroud)

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

await Task.WhenAll(task1, task2, task3, task4, task5);
Run Code Online (Sandbox Code Playgroud)

总结一下.

await关键字做一些编译器魔法,基本上把一个回调在那个地方的方法(分配方法的其余部分是一个延续的时候Task完成),并分配Result的是Task给变量(如果Task有一个结果).这里要解开很多东西; 我不相信简短的回答确实证明了正在发生的事情.

如果不使用await关键字,则只需将Task自身分配给变量即可.