将多个任务分配给多个线程
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将 Task
的 Result
分配给变量(如果 Task
有结果)。这里有很多东西要打开;我不相信一个简短的回答真的证明了正在发生的事情。
如果不使用 await
关键字,那么您只需将 Task
本身分配给变量即可。
我有多个 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将 Task
的 Result
分配给变量(如果 Task
有结果)。这里有很多东西要打开;我不相信一个简短的回答真的证明了正在发生的事情。
如果不使用 await
关键字,那么您只需将 Task
本身分配给变量即可。