c# - 我的方法真的是异步的吗?

标签 c# asynchronous c#-5.0 async-await

我有这样的方法:

public async Task<IEnumerable<Model>> Get([FromUri]IList<string> links)
{
    IList<Model> list = new List<Model>();
    foreach (var link in links)
    {
        MyRequestAsync request = new MyRequestAsync(link);
        list.Add(await request.GetResult());
    }

    return list;
}

但我只是想知道它是否真的是async因为我在想那部分 list.Add(await request.GetResult());return list;打破async方法的性质。

如果我错了,请纠正我,如果我是对的,我该如何解决?

更新:根据我的理解,我必须这样做 C# 5.0 async await return a list return await Task.Run(() => new List<string>() {"a", "b"});但不确定如何将其应用到我的案例中。

最佳答案

您的方法是异步的,但可能没有充分利用资源。

您的方法要做的是进入 foreach 循环,创建 MyRequestAsync 对象,然后(在 await 点)它将放弃它的线程,直到结果可用。一旦结果可用,就会找到合适的线程,方法将恢复运行。它将结果添加到 list 并返回到循环的顶部,并一遍又一遍地重复整个过程。

但是,考虑一下 - 如果这些请求是独立的,您可以改为并行发出每个请求,然后仅在所有 请求完成后才继续运行您的方法。那将是这样的:

public async Task<IEnumerable<Model>> Get([FromUri]IList<string> links)
{
    IList<Task<Model>> list = new List<Task<Model>>();
    foreach (var link in links)
    {
        MyRequestAsync request = new MyRequestAsync(link);
        list.Add(request.GetResult());
    }

    return new List<Model>(await Task.WhenAll(list));
    //Or just
    //return await Task.WhenAll(list);
    //Since we don't need to return a list
}

而且,对于愚蠢的观点,您可以将整个方法重写为:

return await Task.WhenAll(from l in links select new RequestAsync(l).GetResult());

但这可能会降低它的可读性。

关于c# - 我的方法真的是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23133556/

相关文章:

c# - foreach 对变量的使用是否在 C# 5 中发生了变化?

c# - Task.Run() 会对性能产生影响吗?

c# - 是否有可能获得自己的进程名称?

c# - 无法将事件记录到应用程序洞察中

c# - "using"语句中的灾难性故障,即 using(var a= new stream()) 和 a.Something() 抛出异常

asynchronous - 在蓝牙连接事件中发送消息时不接收 AppMessage 回调

multithreading - Delphi 位图中的异步线程绘制

javascript - 将附加参数传递给 Node js 中 fs.readFile 的回调

c# - C# 中的重载解析、扩展方法和泛型

c# - SOAP WCF : Prevent deserialization to private fields