怪奇物语

怪奇物语

首页 新随笔 联系 管理

异步枚举,异步枚举接口,IAsyncEnumerable<T>

IAsyncEnumerable<T>

IAsyncEnumerable<T> 是.NET 中用于异步枚举的接口,允许你在异步操作中逐个处理元素,而不是一次性获取所有元素。
这种方式在处理大量数据或者需要长时间获取数据的场景中非常有用,因为它可以避免一次性将所有数据加载到内存中。

例子

IAsyncEnumerable<ChatMessage> JoinAsync(CancellationToken cancellationToken); 是一个异步方法,其返回值类型为 IAsyncEnumerable<ChatMessage>
这意味着该方法会异步地返回一系列 ChatMessage 对象。

如如何返回异步迭代器,则返回值类型为 IAsyncEnumerable<T>

  1. yield return message; `
public class ChatService
{
    public async IAsyncEnumerable<ChatMessage> JoinAsync([System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken)
    {
        # region Mock Data
        var messages = new List<ChatMessage>
        {
            new ChatMessage
            {
                Author = "Alice",
                Content = "Hello!",
                Time = DateTime.Now
            }
            // .....
        };
        # endregion



        foreach (var message in messages)
        {
            // 模拟一些处理时间
            await Task.Delay(1000, cancellationToken);

            // 检查是否取消了操作
            if (cancellationToken.IsCancellationRequested)
            {
                yield break;
            }
            // ♈♈♈♈♈♈♈♈♈ 异步返回消息
            yield return message;
        }
    }
}

如何遍历异步枚举结果

  1. await foreach (var message in asyncEnumerable)

var chatService = new ChatService();
var cancellationTokenSource = new CancellationTokenSource();

try
{
    IAsyncEnumerable<ChatMessage> asyncEnumerable = chatService.JoinAsync(cancellationTokenSource.Token);
    // ♈♈♈♈♈
    await foreach (var message in asyncEnumerable)
    {
        Console.WriteLine($"[{message.Time}] {message.Author}: {message.Content}");
    }

    // 开始异步枚举消息
    await foreach (var message in chatService.JoinAsync(cancellationTokenSource.Token))
    {
        Console.WriteLine($"[{message.Time}] {message.Author}: {message.Content}");
    }
}
catch (OperationCanceledException)
{
    Console.WriteLine("Operation was canceled.");
}

posted on 2025-06-15 08:00  超级无敌美少男战士  阅读(18)  评论(0)    收藏  举报