C#-并发编程之【四】响应式编程简介
2023-09-11 14:21:56 时间
C#并发编程之【四】响应式编程简介
原创MoMaek浅陌 发布于2019-04-11 14:17:53 阅读数 188 收藏
响应式编程可以像处理数据流一样处理事件流。根据经验,如果事件中带有参数,那么最好采用响应式编程,而不是常规的事件处理程序。
响应式编程基于“可观察的流”(observable stream)这一概念。你一旦申请了可观察流,就可以收到任意数量的数据项(OnNext),并且流在结束时会发出一个错误(OnError)或一个 “流结束”的通知(OnCompleted)。
有些可观察流是不会结束的。实际的接口就像这样:
interface IObserver<in T> {
void OnNext(T item);
void OnCompleted();
void OnError(Exception error);
}
interface IObservable<out T> {
Disposable Subscribe(IObserver<T> observer);
}
但是,我们通常不需要实现这些接口。因为 Reactive Extensions(Rx)库已经实现了所有接口。响应式编程的最终代码非常像 LINQ,可以认为它就是“LINQ to events”。
LINQ 具有的特性,Rx 也都有。Rx 在此基础上增加了很多它自己的操作符,特别是与时间有关的操作符:
Observable.Interval(TimeSpan.FromSeconds(1)) //延时一段时间的计数器(Interval)
.Timestamp() //为每个事件加 了一个时间戳(Timestamp)
.Where(x => x.Value % 2 == 0) //对事件进行过滤,只包含偶数值(Where)
.Select(x => x.Timestamp) //选择时间 戳的值(Timestamp)
.Subscribe(x => Trace.WriteLine(x)); //当每个时间戳值到达时,把它输入调试器(Subscribe)
主要区别在于:LINQ to Object 和 LINQ to Entity 使用“拉取”模式,LINQ 的枚举通过查询拉出数据。而 LINQ to event (Rx)使用“推送”模式,事件到达后就自行穿过查询。
可观察流的定义和其订阅是互相独立的。上面最后一个例子与下面的代码等效:
IObservable<DateTimeOffset> timestamps =
Observable.Interval(TimeSpan.FromSeconds(1))
.Timestamp()
.Where(x => x.Value % 2 == 0)
.Select(x => x.Timestamp);
timestamps.Subscribe(x => Trace.WriteLine(x));
一种常规的做法是把可观察流定义为一种类型,然后将其作为 IObservable< T > 资源使用。 其他类型可以订阅这些流,或者把这些流与其他操作符组合,创建另一个可观察流。
Rx 的订阅也是一个资源。Subscribe 操作符返回一个 IDisposable,即表示订阅完成。当你 响应了那个可观察流,就得处理这个订阅。
相关文章
- C#怎么判断传入int值是否是枚举里面的值
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- [C#基础]c#中的BeginInvoke和EndEndInvoke
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
- 【卷土重来之C#学习笔记】(二)c#编程概述
- C#笔记2 —常量
- C#,迭代深化搜索(IDS)或迭代深化深度优先搜索(IDDFS)算法的源代码
- c#,c++,qt中多线程访问UI控件线程的问题汇总
- C# Socket
- VisionPro控件的使用 C# 开发篇
- c# BufferedStream 类
- c# Bitmap byte[] Stream 文件相互转换
- java 和 C# 响应输出的相似度
- C#高级编程八十三天----程序集的含义
- 《C#零基础入门之百识百例》(七十八)委托事件实例练习3 -- 观察者模式
- C#多线程的实现
- 【C#】遍历List列表的同时,移除访问到的元素
- c#代码规则,C#程序中元素的命名规范
- c#类的定义,c#中的关健字,C#标识符