c# - 我将如何编写自己的FirstOrDefaultAsync()方法

标签 c# .net asynchronous task-parallel-library async-await

我开始着手处理异步/等待编程模型,并试图了解这些模式以及如何使用它们。

给定我有一个返回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()

另一方面,当您具有FirstOrDefaultAsyncList<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/

相关文章:

c# - VS 创建单元测试命令不适用于内部方法?

.net - System.Net.HttpListener 仅显式实现 IDisposable

javascript - 以同步方式执行异步调用

c# - 找不到 System.Windows.Point

c#访问空闲工作流数据

c# - 按日期属性对 GenericList<T> 进行排序

c# - C# 和 .NET 中是否存在 Java URIResolver 概念?

C#访问类内部静态

asynchronous - Rust编译wasm(webassembly)时,怎么休眠10毫秒?

python - Couchbase 的 Twisted API 不适用于 Python Tornado