正在运行同步方法async
本文关键字:async 同步方法 运行 | 更新日期: 2023-09-27 18:21:38
我有一个方法,它迭代对象列表,并为列表中的每个项从外部api获取数据。
有时这可能非常慢(自然),我想把我的所有项目都添加到Taks列表中,以便能够同时运行多个线程。如果不将其全部重写为异步,这可能吗?今天我使用的是WebClient,它可以同步获取所有内容。
我一开始尝试过这样的东西:
public Main()
{
List<Task<Model>> taskList = new List<Task<Model>>();
foreach (var aThing in myThings)
{
taskList.Add(GetStuffAsync(aThing));
}
List<Model> list = Task.WhenAll(taskList.ToArray()).Result.ToList();
}
public async Task<Model> GetStuffAsync(object aThing)
{
// Stuff that is all synchronous
// ...
return anObject;
}
您可以将GetStuff
作为一种普通的同步方法,并使用Task.Run
创建新任务(通常在多个线程上运行),这样您的获取就可以并行进行。您还可以考虑使用Parallel.ForEach
等,这与您当前的Main
代码非常相似。
您的异步方法目前不会执行您想要的操作,因为异步方法至少与第一个await
表达式同步运行。。。在您的情况下,您没有任何await
表达式,所以当GetStuffAsync
返回时,它已经完成了所有实际工作——您没有并行性。
当然,另一种选择是使用当前代码,但实际上确实使GetStuffAsync
异步。
同样值得记住的是,.NET中的HTTP堆栈有每个主机连接池的限制——因此,如果您从同一主机获取多个URL,您可能也需要增加这些限制,否则将无法获得太多并行性。
试试这个概念:
foreach(var aThing in myThings)
{
Thread myTask = new Thread(new ParameterizedThreadStart(TaskMethod));
myTask.Start(aThing);
}
并且必须有一个称为CCD_ 9的方法,即CCD_