正在运行同步方法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;
}

正在运行同步方法async

您可以将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_