首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏DotNet NB && CloudNative

    C# 使用IAsyncEnumerable实现流式分段传输

    前言 在使用SSE的时候,前端可以实现流式传输,但是有个问题就是这是一个独占的连接,相当于如果你不手动关闭连接,就会一直请求,一直连接调用接口,而且发送的数据格式也是按照定义好的协议来 而使用C#自带的IAsyncEnumerable 也可以实现流式传输,不过返回的数据是在之前返回的基础上进行累加,需要自己做处理,我的例子是使用的是ajax来实现,群友有提供了fetch的实现代码,接下来我们看看c#IAsyncEnumerable实现传输的 AJAX 下面是源码和gif效果展示,可以看到我们返回的是一个IAsyncEnumerable< int>类型的结果,在第二段代码,我们都知道ajax是根据xhrhttprequest封装的,所以自然也可以用一些它的一些事件 [HttpGet("Postb")] public async IAsyncEnumerable<int> PostB() { await foreach (var item in GetData ()) { yield return item; } } private async IAsyncEnumerable<int> GetData() {

    93220编辑于 2023-10-29
  • 来自专栏DotNet NB && CloudNative

    .NET最佳实践:webapi返回IAsyncEnumerable提升性能

    IAsyncEnumerable作为一种强大的异步流处理机制,能够帮助我们显著提升Web API的性能。 本文将深入探讨IAsyncEnumerable的原理、优势以及如何在Web API中有效地使用它来提升性能。 一、IAsyncEnumerable简介 IAsyncEnumerable是.NET中用于表示异步数据流的标准接口。 三、在Web API中使用IAsyncEnumerable的示例 1. 结合其他异步操作 IAsyncEnumerable还可以与其他异步操作结合使用,实现更复杂的功能。

    81400编辑于 2025-03-24
  • 来自专栏单片机/c#技术分享

    【分段传输】c#使用IAsyncEnumerable实现流式分段传输

        在使用SSE的时候,前端可以实现流式传输,但是有个问题就是这是一个独占的连接,相当于如果你不手动关闭连接,就会一直请求,一直连接调用接口,而且发送的数据格式也是按照定义好的协议来,而使用c#自带的IAsyncEnumerable 也可以实现流式传输,不过返回的数据是在之前返回的基础上进行累加,需要自己做处理,我的例子是使用的是ajax来实现,群友有提供了fetch的实现代码,接下来我们看看c#IAsyncEnumerable实现传输的 AJAX      下面是源码和gif效果展示,可以看到我们返回的是一个IAsyncEnumerable<int>类型的结果,在第二段代码,我们都知道ajax是根据xhrhttprequest封装的,所以自然也可以用一些它的一些事件 [HttpGet("Postb")] public async IAsyncEnumerable<int> PostB() { await foreach (var item in GetData ()) { yield return item; } } private async IAsyncEnumerable<int> GetData() {

    90150编辑于 2023-10-23
  • 来自专栏calvin

    解决返回IAsyncEnumerable类型时抛出的OperationCanceledException会被AspNetCore 框架吞掉的Bug

    记录一个我认为是Net6 Aspnetcore 框架的一个Bug Bug描述 在 Net6 的apsnecore项目中, 如果我们(满足以下所有条件) api的返回类型是IAsyncEnumerable [HttpGet("/asyncEnumerable-cancel")] public ActionResult<IAsyncEnumerable<int>> TestAsync() { async IAsyncEnumerable<int> asyncEnumerable() { await Task.Delay(100); yield return 1

    78610发布于 2021-11-30
  • 来自专栏JusterZhu

    C# 异步流

    async IAsyncEnumerable<int> GenerateNumbersAsync() { for (int i = 0; i < 10; i++) { await async IAsyncEnumerable<int> GenerateNumbersAsync() { for (int i = 0; i < 10; i++) { await async IAsyncEnumerable<int> GenerateNumbersAsync() { for (int i = 0; i < 10; i++) { await Task.Delay(100); yield return i; } } async IAsyncEnumerable<string> GenerateStringsAsync <object> MergeAsyncStreams(IAsyncEnumerable<int> numbers, IAsyncEnumerable<string> strings) { await

    74830编辑于 2023-10-24
  • 来自专栏老王Plus

    一文说通异步 LINQ

    看代码: static IAsyncEnumerable<T> Where<T>(this IAsyncEnumerable<T> source, Func<T, bool> predicate) { IAsyncEnumerable<User> users = ... 处理也很简单: static IAsyncEnumerable<T> Where<T>(this IAsyncEnumerable<T> source, Func<T, bool> predicate) 代码是这样: static IAsyncEnumerable<T> WhereAwait<T>(this IAsyncEnumerable<T> source, Func<T, ValueTask<bool 看代码: static IAsyncEnumerable<T> WhereAwaitWithCancellation<T>(this IAsyncEnumerable<T> source, Func<T

    1.1K10发布于 2021-11-04
  • 来自专栏DotNet NB && CloudNative

    C# 中的异步流与数据处理管道

    借助 C# 的异步流和 IAsyncEnumerable,我们能够创建异步数据处理的无缝流程,同时保持出色的可读性和性能。 它们使用 IAsyncEnumerable<T> 接口来允许对异步操作的集合进行迭代。 主要优点: 异步执行:减少诸如 I/O 或网络调用等高延迟操作中的阻塞情况。 async IAsyncEnumerable<string>GenerateLogsAsync() { string[] logLevels ={"INFO","WARN","ERROR"}; async IAsyncEnumerable<string>FilterLogsAsync(IAsyncEnumerable<string> logs) { awaitforeach(var log ; } } } 异步流 IAsyncEnumerable 为构建响应迅速且可扩展的数据管道提供了一种优雅的解决方案。从日志处理到实时数据分析,其潜在应用非常广泛。

    54310编辑于 2025-03-29
  • 来自专栏喵叔's 专栏

    何为异步流

    异步流是在C#8中引入的,它以IAsyncEnumerable和IAsyncEnumerator: IAsyncDisposable两个接口为基础,这两个接口的代码如下: public interface IAsyncEnumerable<out T> { IAsyncEnumerator<T> GetAsyncEnumerator (); } public interface IAsyncEnumerator 要实现这个功能就必须使用IAsyncEnumerable接口作为方法的返回类型。 修改后的代码如下: async IAsyncEnumerable<int> FibonacciAsync(int count) { int prev = 1; int curr = 1; 这时就需要引入System.Linq.Async,调用如下: IAsyncEnumerable<int> query = from f in FibonacciAsync(200) where

    50810编辑于 2021-12-15
  • 来自专栏walterlv - 吕毅的博客

    如何在旧版本的 .NET Core Framework 中使用 C# 8 的异步流(IAsyncDisposable IAsyncEnumerable IAsyncEnumerator)

    如何在旧版本的 .NET Core / Framework 中使用 C# 8 的异步流(IAsyncDisposable / IAsyncEnumerable / IAsyncEnumerator) 2020-01-03 09:17 C# 8.0 为我们带来了异步流,可以使用 async foreach,不过使用此语法需要 IAsyncEnumerable / IAsyncEnumerator 使用异步流 定义支持异步流的方法 private async IAsyncEnumerable<string> EnumerateTestsAsync() { for (var i = 0; i

    2.1K20发布于 2020-02-11
  • C#异步编程的四种实现方式

    本文将深入探讨C#中的四种主要异步实现方式:基于async和await的异步方法、基于Task的异步编程、基于IAsyncEnumerable的异步数据流以及基于TPL Dataflow的异步数据流处理 基于IAsyncEnumerable的异步数据流IAsyncEnumerable是.NET Core 2.0引入的,它提供了一种异步枚举大量数据的方式。这种方式特别适合处理大数据集或流式数据。 3.1 使用IAsyncEnumerable通过实现IAsyncEnumerable<T>接口,你可以创建一个异步数据流。 public async IAsyncEnumerable<int> GetLargeDataAsync(){ for (int i = 0; i < 1000000; i++) { yield return await SomeAsyncOperation(i); }}3.2 消费异步数据流使用await foreach可以异步地遍历IAsyncEnumerable<T>。

    4.8K00编辑于 2024-10-11
  • 来自专栏全球技术精选

    .NET 6 中的七个 System.Text.Json 特性

    // { // "value": 10.2 // }, // { // "value": 10.0 // } // ] // } IAsyncEnumerable 支持 在 .NET 6 中, System.Text.Json 支持 IAsyncEnumerable。 static async IAsyncEnumerable<int> GetNumbersAsync(int n) { for (int i = 0; i < n; i++) { Data": [ // 0, // 1, // 2, // 3, // 4 // ] // } // Deserialization using IAsyncEnumerable memoryStream = new(Encoding.UTF8.GetBytes("[0,1,2,3,4]")); // Wraps the UTF-8 encoded text into an IAsyncEnumerable

    92510编辑于 2022-01-04
  • 来自专栏码农阿宇

    聊一聊C# 8.0中的await foreach

    IAsyncEnumerable 其实,在C# 8.0中Task<IEnumerable>这种组合称为IAsyncEnumerable。 和 IAsyncEnumerator,定义如下: public interface IAsyncEnumerable<out T> { IAsyncEnumerator<T> 来对函数进行改造,如下. static async Task ConsumeAsyncSumSeqeunc(IAsyncEnumerable<int> sequence) { await Task.Delay(TimeSpan.FromSeconds(1)); }; } private static async IAsyncEnumerable IAsyncEnumerable<int> pullBasedAsyncSequence = ProduceAsyncSumSeqeunc(count); // Start another

    1.9K00发布于 2019-04-18
  • 来自专栏token的技术分享

    .NET 如何实现ChatGPT的Stream传输

    简单的大数据量的数据进行推送到客户端 耗时并且持续化的数据传输 等 ASP.NET Core 实现 创建WebApi项目 在Controllers中新建一个StreamController.cs文件,并且提供一个IAsyncEnumerable <out T>的Demo IAsyncEnumerable<out T> 公开对指定类型的值提供异步迭代的枚举器。 Route("[controller]")] public class StreamController : ControllerBase { [HttpPost] public async IAsyncEnumerable <char> Test() { const string value = "这是一个完整的测试数据;为了测试IAsyncEnumerable<T>的使用"; foreach 下面写客户端的实现,客户端也是用.NET 使用js实现调用 首先启动api服务,然后在打开的swagger的浏览器界面中打开开发者工具使用F12打开开发者工具 在控制台中添加fetchAsStream方法用于调用IAsyncEnumerable

    70830编辑于 2023-10-13
  • 来自专栏精益码农

    C#8.0宝藏好物Async streams

    之前写《.NET gRPC 核心功能初体验》,利用gRPC双向流做了一个打乒乓的Demo,存储消息的对象是IAsyncEnumerable<T>,这个异步可枚举泛型接口支撑了gRPC的实时流式通信。 这是一个[相互独立的长耗时行为的集合(假设分别耗时5,4,3,2,1s)], 我们使用C#8.0异步可枚举类型IAsyncEnumerable,异步 产生/消费枚举元素。 与同步版本IEmunerable类似,IAsyncEnumerable也有对应的IAsyncEnumerator迭代器,迭代器的实现过程决定了foreach消费的顺序。 返回异步流的方法特征: 以async修饰符声明 返回IAsyncEnumerable<T>对象 方法包含yield return语句,用来异步持续返回元素 static async Task Main( static async IAsyncEnumerable<string> FetchAllHtml() { var tasklist= new List<Task<string>>();

    1.2K30发布于 2021-04-21
  • 来自专栏DotNet NB && CloudNative

    .NET 9新特性:Task.WhenEach

    第三步:在 .NET 9 中使用 Task.WhenEach Task.WhenEach 返回一个 IAsyncEnumerable,允许异步处理任务,按完成顺序逐一处理。 返回一个 IAsyncEnumerable<Task<int>>。该集合表示将随着时间推移而完成的一系列任务。 await foreach (var task in Task.WhenEach(printTasks)) 这是一个异步 foreach 循环,用于遍历 Task.WhenEach 返回的 IAsyncEnumerable

    25310编辑于 2024-12-23
  • 来自专栏c#分享专栏

    C#的async 和 await 关键字

    var result = await GetCountAsync(); // 确保result被使用4.5 考虑使用IAsyncEnumerable对于大量数据的异步枚举,使用IAsyncEnumerable public async IAsyncEnumerable<int> GetNumbersAsync(){ for (int i = 0; i < 100; i++) { await

    4.9K00编辑于 2024-10-08
  • 来自专栏c#分享专栏

    C#的异步流

    这种机制基于三个核心接口:IAsyncEnumerable<T>:定义了异步枚举的集合。IAsyncEnumerator<T>:提供了对异步流中每个元素的访问。 实现异步流创建异步流要创建一个异步流,你需要定义一个返回IAsyncEnumerable<T>的方法,并使用await和yield return来异步生成数据。 public async IAsyncEnumerable<int> GenerateNumbersAsync(int max){ for (int i = 0; i < max; i++)

    4.8K00编辑于 2024-10-09
  • 来自专栏c#分享专栏

    C#的Task 和 Task<T>

    var result = await GetCountAsync(); // 确保result被使用4.5 考虑使用IAsyncEnumerable对于大量数据的异步枚举,使用IAsyncEnumerable public async IAsyncEnumerable<int> GetNumbersAsync(){ for (int i = 0; i < 100; i++) { await

    4.9K00编辑于 2024-10-08
  • 来自专栏全球技术精选

    为什么.NET Standard 仍然有意义?

    之所以存在,面向.NET Standard 2.0的库提供了最大可能的覆盖范围,并启用了几乎所有现代的.NET功能,例如C#9,IAsyncEnumerable等,因此所有库都应针对该平台。 支持.NET Standard 2.0和.NET 5 您可以在.NET Standard 2.0中使用最新的.NET特性,比如 C#9,IAsyncEnumerable ,Span,System.Text.Json } return this; } ///

    /// Use an Async foreach with IAsyncEnumerable

    70230发布于 2021-01-21
  • 来自专栏Niuery的技术日记

    探索 yield 关键字

    GenerateNumbersAsync()) { Console.WriteLine(number); } } public static async IAsyncEnumerable 1000); yield return i; } } } 上述代码定义了一个名为 GenerateNumbersAsync 的异步方法,该方法返回一个 IAsyncEnumerable \t{DateTime.Now}"); } Console.WriteLine($"水全部舀完~\t{DateTime.Now}"); } private static async IAsyncEnumerable

    41720编辑于 2023-10-22
领券