我有这样的方法:
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/