gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:06:29 25 4
gpt4 key购买 nike

我有这样的方法:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com