我开始着手处理异步/等待编程模型,并试图了解这些模式以及如何使用它们。
给定我有一个返回Task<List<string>> GetListAsync()
的方法
我如何像这样编写自己的FirstOrDefault()方法
Task<string> result = GetListAsync().FirstOrDefaultAsync();
这感觉不对:
var resultList = await GetListAsync();
var firstElementTask = Task.FromResult(resultList.FirstOrDefault());
我不破坏异步/等待编程模型的有效方法是什么?
最佳答案
当您的方法返回Task<List<string>>
时,创建FirstOrDefaultAsync
并没有多大意义。您当然可以,但是并没有太大帮助。
因为在任务完成之前您无法获得List<string>
。任务完成后,您将剩下内存集中的List<string>
。它具有您需要的所有元素。此时,您可以只调用yourList.FirstOrDefault()
。
另一方面,当您具有FirstOrDefaultAsync
或List<Task<string>>
时,创建IEnumerable<Task<string>>
是有意义的。
public async Task<T> FirstOrDefaultAsync<T>(IEnumerable<Task<T>> tasks)
{
var first = await Task.WhenAny(tasks);
return await first;
}
正如@ i3arnon在注释中指出的那样,该方法将返回任务的结果,以先完成的为准。不是列表中的第一个。
关于c# - 我将如何编写自己的FirstOrDefaultAsync()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28602019/