首页 > 其他分享 >异步与yield

异步与yield

时间:2023-12-26 23:55:23浏览次数:30  
标签:异步 Console 迭代 yield async return

1.yield

迭代器中使用 yield 语句提供下一个值或表示迭代结束。

yield return:在迭代中提供下一个值

yield break:显式示迭代结束

迭代器的执行:当开始对迭代器的结果进行迭代时,迭代器会一直执行,直到到达第一个 yield return 语句为止。 然后,迭代器的执行会暂停,调用方会获得第一个迭代值并处理该值。 在后续的每次迭代中,迭代器的执行都会在导致上一次挂起的 yield return 语句之后恢复,并继续执行,直到到达下一个 yield return 语句为止。 当控件到达迭代器或 yield break 语句的末尾时,迭代完成。

如以下示例所示:

var numbers = ProduceEvenNumbers(5);
Console.WriteLine("Caller: about to iterate.");
foreach (int i in numbers)
{
    Console.WriteLine($"Caller: {i}");
}

IEnumerable<int> ProduceEvenNumbers(int upto)
{
    Console.WriteLine("Iterator: start.");
    for (int i = 0; i <= upto; i += 2)
    {
        if(i<5)
        {
        Console.WriteLine($"Iterator: about to yield {i}");
        yield return i;
        Console.WriteLine($"Iterator: yielded {i}");
        }
        else
            yield break;
    }
    Console.WriteLine("Iterator: end.");
}
// Output:
// Caller: about to iterate.
// Iterator: start.
// Iterator: about to yield 0
// Caller: 0
// Iterator: yielded 0
// Iterator: about to yield 2
// Caller: 2
// Iterator: yielded 2
// Iterator: about to yield 4
// Caller: 4
// Iterator: yielded 4

 

2.异步中的yield

yield return 不仅能简化数据的返回,而且可以让数据处理“流水线化”,提升性能。

asyncs是提示编译器为异步方法中的await代码进行分段处理的,而一个异步方法是否修饰为async对于方法的调用者而言没有区别,抽象方法不能修饰为async。

C#8.0之前,async方法中不能用yield(两个都是分段处理)。8.0开始,把返回值声明为IAsyncEnumerable,然后遍历的时候用await foreach()即可。

static async Task Main(string[] args)
{
    await foreach (var value in Test())
    {
        Console.WriteLine(value);
    }       
}

static async IAsyncEnumerable<string> Test()
{
    yield return "11";
    yield return "22";
    yield return "33";
}
//执行结果:
//11
//22
//33

 

标签:异步,Console,迭代,yield,async,return
From: https://www.cnblogs.com/xixi-in-summer/p/17929627.html

相关文章

  • 多线程里锁,异步问题
    多线程里锁,异步问题,开发碰到的问题,这里记录一下,避免下次出现使用lock虽然可以解决线程安全问题,但是同时也限制了并发。使用lock的注意点:A不能是lock(null),可以编译但不能运行;B不推荐lock(this),外面如果也要用实例,就冲突了;C不应该是lock(string字符串),string在内存分......
  • 收不到异步通知的原因
    之前有和大家分享过支付宝异步通知如何使用 的相关内容,但是有些时候吧,就是收不到异步通知,也不知道是什么原因导致的。今天来帮大家汇总下在「收不到异步通知」的情况下,如何排查问题出现在哪里。  异步通知发送的条件在文章[手把手|支付宝异步通知如何使用]中有详细介绍......
  • 关于异步处理,请分清真正需要异步处理的逻辑
    我们的税地系统其中一次需求迭代的开发内容:每次调用银行接口查询订单支付状态时,如果对方返回404-订单不存在,并且如果订单是在5min前创建的,那么,就触发重新下发,要求每笔订单只可重发一次。 展示代码前,下面用类时序图来直观介绍一下这3个类以及实现脉络。 下面贴程序实现代码(......
  • Trace 在多线程异步体系下传递
    在多线程异步体系下传递异步编程基础什么是异步编程异步编程基础异步编程是一种编程模式,用于处理多线程异步体系下的任务传递和执行。通常情况下,传统的同步编程,任务按照顺序依次执行,直到完成才能进行下一个任务。在多线程异步体系下,任务可以并行执行,无需按照顺序等待前一个任务完成......
  • 解决先异步调用一个接口,再根据返回值继续循环异步,然后再同步的场景.then的连续调用
    场景描述:人员select下拉框为分页只查20个数据下拉(真实数据可能下拉有大几千),但是编辑页进来的id不在这20个数据下拉之内,所以显示的就是id值数组(因为是多选下拉框)解决:编辑回显方法内写getUserSecList(data.collaboratorVoList);然后先调人员20个下拉,调完后,根据传参的编辑i......
  • 同事突然问我:异步网络请求编码的方法
    本文分享自华为云社区《异步网络请求编码》,作者:张俭。本文介绍常见的异步网络请求编码手法。尽管像golang这些的语言,支持协程,可以使得Programmer以同步的方式编写代码,大大降低编码者的心智负担。但网络编程中,批量又非常常见,这就导致即使在Golang中,也不得不进行协程的切换来满足......
  • Python异步编程之yield from
    yieldfrom简介yieldfrom是Python3.3后新加的语言结构,可用于简化yield表达式的使用。yieldfrom简单示例:>>>defgen():...yieldfromrange(10)...>>>g=gen()>>>next(g)0>>>next(g)1>>>yieldfrom用于获取生成器中的值,是对yield使用的一种......
  • python代码实现保存微博文娱榜的数据Ajax异步加载
    最近有小伙伴看完蜜蜂之前分享的爬虫文章之后,使用python代码实现了自动保存网站上面的图片到本地,但是最近又有新的需求。需求描述:爬取微博文娱榜的数据,并保存到csv文件中网址:https://weibo.com/hot/entertainment需要将一下框上的两个字段都爬取下来。对于这样的需求,看过蜜蜂之前......
  • Netty使用CompletableFuture实现异步串行队列
    一、前言CompletableFuture是JDK1.8提供的一种更加强大的异步编程的api。它实现了Future接口,也就是Future的功能特性CompletableFuture也有。它也实现了CompletionStage接口,CompletionStage接口定义了任务编排的方法,执行某一阶段,可以向下执行后续阶段。CompletableFuture相比于Futu......
  • java的8种异步实现方式
    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过异步实现的场景。异步的八种实现方式线程ThreadFuture异步框架CompletableFutureSpring注解@A......