当前位置: 首页 > news >正文

C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式

 核心概念

  1. IObservable<T>

    1. 表示 可观察的数据源(如事件流、实时数据)。

    2. 关键方法:Subscribe(IObserver<T> observer),用于注册观察者。

  2. IObserver<T>

    1. 表示 数据的接收者,响应数据变化。

    2. 三个核心方法:

      1. OnNext(T value):接收新数据。

      2. OnError(Exception error):处理错误。

      3. OnCompleted():响应数据流结束。

观察者实现:

  public class 观察者 : IObserver<float>{public void OnNext(float price){Console.WriteLine($"最新股价: {price}$");}public void OnError(Exception ex){Console.WriteLine($"错误: {ex.Message}");}public void OnCompleted(){Console.WriteLine("股票数据流结束");}}

被观察者实现:

 public class 被观察者 : IObservable<float>{private List<IObserver<float>> _observers = new List<IObserver<float>>();public IDisposable Subscribe(IObserver<float> observer){_observers.Add(observer);return new Unsubscriber(_observers, observer);}//这段代码定义了一个 Unsubscriber 内部类,用于管理观察者(IObserver<T>)的订阅和取消订阅逻辑。//它的核心作用是 安全地从观察者列表中移除某个观察者,避免内存泄漏或无效通知。private class Unsubscriber : IDisposable{private List<IObserver<float>> _observers;private IObserver<float> _observer;public Unsubscriber(List<IObserver<float>> observers, IObserver<float> observer){_observers = observers;_observer = observer;}public void Dispose(){if (_observer != null && _observers.Contains(_observer))_observers.Remove(_observer);}}// 模拟股价变动public void UpdatePrice(float price){foreach (var observer in _observers){observer.OnNext(price);}}public void MarketClosed(){foreach (var observer in _observers){observer.OnCompleted();}}}

WInform调用案例:

    public partial class Form1 : Form{public Form1(){InitializeComponent();}观察者 A = new 观察者();被观察者 B = new 被观察者();IDisposable A回执;private void btn_观察_Click(object sender, EventArgs e){A回执 = B.Subscribe(A);}private void btn_取消观察_Click(object sender, EventArgs e){A回执.Dispose();}private void btn_价格一_Click(object sender, EventArgs e){B.UpdatePrice(1);}private void btn_价格二_Click(object sender, EventArgs e){B.UpdatePrice(2);}private void btn_股市关闭_Click(object sender, EventArgs e){B.MarketClosed();}}

相关文章:

C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式

核心概念 IObservable<T> 表示 可观察的数据源&#xff08;如事件流、实时数据&#xff09;。 关键方法&#xff1a;Subscribe(IObserver<T> observer)&#xff0c;用于注册观察者。 IObserver<T> 表示 数据的接收者&#xff0c;响应数据变化。 三个核心…...

多模态大模型文字识别 vs OCR识别模型

论文简述 多模态大语言模型(Multimodal Large Language Models,简称多模态LLMs)具有高度通用性,能够处理图像描述、文档分析和自动化内容生成等多种任务。这种广泛的适用性使其在不同工业领域都受到了大量关注。 在OCR方面,多模态LLMs的表现超过了专门为OCR设计的模型。这…...

[区块链] 持久化运行区块链 | 并通过HTTP访问

实验目标 以Web服务的形式持久化运行区块链&#xff0c;并通过HTTP接口的形式实现对区块链的操作。 实验内容 构建区块链的区块对象和区块链对象。使用Flask等Web服务框架运行持久化的进程&#xff0c;实现基于HTTP接口实现新区块的添加功能以及传递区块索引查询区块链中的区…...

批量将不同位置的多个文件复制到一个文件夹

在日常工作中&#xff0c;我们常常需要将多个位置的文件集中到一个文件夹中。手动一个个复制文件既费时又容易出错。使用批量文件复制工具&#xff0c;您可以轻松将不同位置的多个文件快速复制到一个文件夹中&#xff0c;大大提高工作效率。 今天给大家介绍一下批量将不同位置的…...

CentOS 下 Zookeeper 常用命令与完整命令列表

一、服务管理命令 常用服务命令 启动 Zookeeper 服务: systemctl start zookeeper # 使用 systemd (推荐) /usr/local/zookeeper/bin/zkServer.sh start # 直接启动 停止服务: systemctl stop zookeeper /usr/local/zookeeper/bin/zkServer.sh stop 查看服务状态…...

React与Vue:哪个框架更适合入门?

React与Vue&#xff1a;选择哪个框架入门&#xff1f; 一、框架定位与发展趋势 1.1 技术背景对比 ‌React‌&#xff1a;Meta&#xff08;原Facebook&#xff09;2013年推出&#xff0c;采用声明式编程范式&#xff0c;专注构建用户界面‌Vue‌&#xff1a;尤雨溪2014年推出…...

突发!GitHub 被曝封禁中国区 IP

昨天&#xff0c;大量国内开发者发现&#xff0c;未登录状态下访问GitHub官网时&#xff0c;页面显示“Access to this site has been restricted.”&#xff0c;中国大陆及香港IP均被限制。尽管GitHub官方尚未发布声明&#xff0c;但多方实测显示&#xff1a; 猪哥亲测在已登…...

向量数据库Qdrant 安装 不使用docker

一、导读 环境&#xff1a;Ubuntu 24.04、Windows 10、WSL 2、Qdrant 1.13.4 背景&#xff1a;换了新工作&#xff0c;使用qdrant作为向量库&#xff0c;需要不使用docker安装 时间&#xff1a;20250415 说明&#xff1a;初入职&#xff0c;不了解&#xff0c;暂且记下 二、…...

基于坐标的神经表示实现零样本学习以用于快速三维多参数定量磁共振成像|文献速递-深度学习医疗AI最新文献

Title 题目 Coordinate-based neural representation enabling zero-shot learning for fast 3D multiparametric quantitative MRI 基于坐标的神经表示实现零样本学习以用于快速三维多参数定量磁共振成像 01 文献速递介绍 定量磁共振成像&#xff08;qMRI&#xff09;能…...

每日算法-250415

每日算法 - 2024-04-15: 今天我们来解决两道 LeetCode 上关于在旋转排序数组中寻找最小值的问题。 153. 寻找旋转排序数组中的最小值 题目描述 思路 核心思想是利用 二分查找。 解题过程 一个升序排序的数组&#xff08;无重复元素&#xff09;在经过若干次旋转后&#xf…...

第16届蓝桥杯省赛JavaB组真题回顾

第16届蓝桥杯省赛已经结束了&#xff0c;第一次参加也是坐牢了4个小时&#xff0c;现在还是来总结一下吧&#xff08;先声明以下的解法&#xff0c;大家可以当作一种思路来看&#xff0c;解法不一定是正解&#xff0c;只是给大家提供一种能够正常想到的思路吧&#xff09; 试题…...

[Godot] C#人物移动抖动解决方案

在写一个2D平台跳跃的游戏代码发现&#xff0c;移动的时候会抖动卡顿的厉害&#xff0c;后来研究了一下抖动问题&#xff0c;有了几种解决方案 1.垂直同步和物理插值问题 这是最常见的可能导致画面撕裂和抖动的原因&#xff0c;大家可以根据自己的需要调整项目设置&#xff0…...

hackmyvm-quick2

收集信息 arp-scan -l nmap 192.168.66.74 dirsearch -u http://192.168.66.74 -e * 访问file.php 尝试查看/etc/passwd 抓包 payload: /file.php?file=/home/andrew/.bashrc /file.php?file=/home/nick/.bashrc...

TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(一)

引言 在当今数字化时代&#xff0c;物联网&#xff08;IoT&#xff09;、工业互联网等领域蓬勃发展&#xff0c;产生了海量的时序数据。这些数据记录了设备状态、传感器读数、业务指标等随时间变化的信息&#xff0c;对于企业的运营监控、数据分析和决策制定起着关键作用。为了…...

Jetson agx Orin 适配Xenomai4

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、Xenomai 4 二、使用步骤 1.获取源码 2.编译源码 3、安装 4、运行效果 5、libevl 总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了…...

Terraform - 理解 Count 和 For_Each 循环

概述 使用 Terraform 时&#xff0c;您可能需要为同一资源创建多个实例。这时 count 和 for_each 循环就派上用场了。这些循环允许您创建具有相同配置但具有不同值的多个资源。本指南将讲解如何在 Terraform 中使用 count 和 for_each 循环。 Terraform 中的 Count Terraform …...

Git本地更新和远端同步操作

1、将远端文件夹拉取到本地 从0—1&#xff1a;克隆 在文件夹空白处点击&#xff1a;Git克隆 输入url&#xff0c;克隆到本地 输入远端文件地址&#xff0c;点击确定&#xff0c;远端文件即可克隆到本地 2、拉取远端更新到本地 文件克隆到本地后&#xff0c;每次更新需…...

激活函数Softmax在不同维度上的应用 | dim参数理解

理解 Softmax 在不同维度上的应用&#xff0c;关键在于明确 Softmax 的作用以及 dim 参数的意义。Softmax 的目标是将输入张量的某些元素转换为概率分布&#xff0c;使得这些元素的和为1。dim 参数决定了沿着哪个维度进行归一化操作。 1. Softmax 的基本原理 Softmax 函数的公…...

地理人工智能中位置编码的综述:方法与应用

以下是对论文 《A Review of Location Encoding for GeoAI: Methods and Applications》 的大纲和摘要整理&#xff1a; A Review of Location Encoding for GeoAI: Methods and Applications 摘要&#xff08;Summary&#xff09; 本文系统综述了地理人工智能&#xff08;G…...

6.DJI-PSDK:psdk订阅无人机高度/速度/GPS/RTK/时间/经纬度等消息及问题解决

DJI-PSDK:psdk订阅无人机高度/速度/GPS/RTK/时间/经纬度等消息 消息订阅可以获取绝大多数无人机的动态信息,包括无人机的姿态、速度、加速度、角速度、高度、GPS 位置、云 台的角度和状态、飞行模式和飞行状态、电机和电池等各类关键信息。 这些信息并不会“一股脑儿地”全部…...

ArrayList的subList的数据仍是集合

ArrayList的subList结果不可强转成ArrayList&#xff0c;否则会抛出 ClassCastException异常 • 级别&#xff1a; 【CRITICAL】 • 规约类型&#xff1a;BUG • 最坏影响&#xff1a; 程序错误&#xff0c;抛出异常 说明&#xff1a;subList 返回的是ArrayList的内部类SubL…...

VS Code怎么换颜色

在 VS Code 中&#xff0c;你可以通过修改主题或自定义编辑器颜色来将界面改为白色。以下是几种方法&#xff1a; 方法 1&#xff1a;切换浅色主题&#xff08;推荐&#xff09; VS Code 自带多个浅色主题&#xff0c;可以直接切换&#xff1a; 按快捷键 Ctrl K&#xff0c;…...

jupyter中切换Anaconda虚拟环境

jupyter中切换虚拟环境 查看python路径 import sys sys.executable这个命令会输出当前 Notebook 使用的 Python 可执行文件的路径 2. 查看安装的包和环境信息&#xff08;前两步都在jupyter notebook中进行&#xff09; !which python !python --version !pip list将你的虚拟…...

红帽认证 Linux安全 级别

红帽认证体系将安全能力划分为‌专项技能认证‌与‌架构师路径‌&#xff0c;覆盖从基础加固到企业级安全架构设计。以下是安全相关认证的级别、核心内容及职业定位&#xff1a; 一、红帽安全认证分级与定位‌ 认证名称级别考试代码核心方向考试难度适用人群‌Red Hat Certif…...

从服务器多线程批量下载文件到本地

1、客户端安装 aria2 下载地址&#xff1a;aria2 解压文件&#xff0c;然后将文件目录添加到系统环境变量Path中&#xff0c;然后打开cmd&#xff0c;输入&#xff1a;aria2c 文件地址&#xff0c;就可以下载文件了 2、服务端配置nginx文件服务器 server {listen 8080…...

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject&#xff1a;处于继承体系最顶端&#xff0c;是一个抽象类。它为 WPF 元素提供了与 Dispatcher&#xff08;调度器&#xff09;交互的能力&#xff0c;Dispatcher 负责管理线程间的消息传递&#xff0c;确保 UI 操作在正确的线程&#xff08;通常是 …...

ROS IkFast运动学插件

ikFast运动学插件生成 环境安装ROS依赖安装openrave依赖下载依赖代码工具使用urdf转dae设置精度查看模型关节生成代码生成插件 环境 ubuntu 20.04ROS版本&#xff1a;noetic 安装ROS依赖 sudo apt-get install -y ros-noetic-desktop ros-noetic-collada-urdf ros-noetic-mov…...

Flink Hive Catalog最佳实践

Flink Hive Catalog 最佳实践 一、配置与初始化 依赖管理 Hive Connector 版本对齐&#xff1a;需确保 flink-sql-connector-hive 版本与 Hive 版本严格匹配&#xff08;如 Hive 3.1.3 对应 flink-sql-connector-hive-3.1.3_2.12&#xff09;&#xff0c;同时添加 Hadoop 遮蔽…...

接口测试之postman使用指南

一、为何使用postman postman是一款简单高效的接口测试工具&#xff0c;能够很方便发送接口请求&#xff0c;易于保存接口请求脚本&#xff0c;postman提供接口响应数据比对功能&#xff0c;可以设置预期结果作断言&#xff0c;还能把测试用例放在一个集合中批量执行&#xff…...

小豆包api:支持GPT-4.1全新系列模型api,纯官逆向可用!

今天凌晨&#xff0c;OpenAI正式发布GPT-4.1系列模型&#xff0c;带来标准版GPT-4.1&#xff0c;更轻量快速GPT-4.1 mini和极致性价比的GPT-4.1 nano三款模型&#xff0c;全面超越GPT-4o&#xff0c;更聪明、更便宜。 小豆包api已全面支持GPT-4.1全新系列模型&#xff01; 与前…...

GPTNet如何革新创意与效率

引言 人工智能正在以前所未有的速度改变我们的工作与生活方式&#xff0c;从智能写作到视觉创作&#xff0c;AI工具已成为不可或缺的伙伴。在众多平台中&#xff0c;GPTNet以其强大的功能整合和直观体验崭露头角。它不仅汇集了GPT系列、Claude、Grok、Gemini等顶级对话模型&am…...

3.3.6 VO-O语法- 流程算子

流程算子是VO语言最重要的一类语法算子。它们是VO语言特有的语法概念。这些算子属于容器算子&#xff0c;用于组织管理各类流程。这样的设计有利于流程的复用。可以将流程视为一个大级别的函数模块&#xff0c;在更大的业务逻辑中复用&#xff0c;从而降低业务开发的复杂度&…...

c++引入nacos,详细步骤

以下是将Nacos引入C项目的详细步骤&#xff0c;包括安装、配置和代码实现&#xff1a; 1. 安装Nacos服务器 下载Nacos服务器安装包&#xff0c;可以从Nacos官网获取最新版本。 解压安装包并启动Nacos服务器&#xff1a; cd nacos/bin sh startup.sh -m standalone 这将启动…...

OpenAI 最新发布的 GPT-4.1 系列在 API 中正式上线

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

亚远景-自动驾驶时代,ASPICE评估标准将如何演进?

自动驾驶时代&#xff0c;ASPICE评估标准将从以下几个方面演进&#xff1a; 1. 技术领域的扩展 增加硬件工程和机器学习过程组 &#xff1a;ASPICE 4.0版本新增了硬件工程和机器学习过程组&#xff0c;以应对自动驾驶系统中硬件与软件深度融合的需求。自动驾驶功能的实现不仅依…...

Redis 数据类型全解析:从基础到实战应用

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Redis 作为高性能的键值对存储系统&#xff0c;其丰富的数据类型是实现复杂业务逻辑的核心优势。本文将深入解析 Redis 六大核心数据类型及扩展类型&#xff…...

基于JSP+MySQL实现用户注册登录及短信发送功能

用户注册信息存入数据库 内容介绍 此项目是前台用户的登录和注册&#xff0c;,这部分包括两个子部分:其中一个为新用户注册&#xff0c;在这里我们可以通过注册浏览更多信息;另一个是用户登录&#xff0c;用户登录系统是一.般 Web 网站都有的子系统,其作用是限制该网站某些资…...

Spark-SQL核心编程2

路径问题 相对路径与绝对路径&#xff1a;建议使用绝对路径&#xff0c;避免复制粘贴导致的错误&#xff0c;必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法&#xff1a;创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法&#xff1a;使用 DSL 风格语法查询…...

Flink SQL SavePoint最佳实践

以下是 Flink SQL Savepoint 最佳实践&#xff0c;涵盖配置、触发、恢复及注意事项&#xff0c;高效管理作业状态&#xff1a; 一、Savepoint 的配置与触发 1. 基础配置 存储路径&#xff1a;在 flink-conf.yaml 中全局设置 Savepoint 存储目录&#xff0c;避免每次手动指定路…...

【无标题】Spark-SQL编程(2)

以下是今天学习的知识点以及代码测试&#xff1a; Spark-SQL核心编程&#xff08;四&#xff09; 实验内容&#xff1a; 利用IDEA开发Spark-SQL。 实验步骤&#xff1a; 利用IDEA开发Spark-SQL 创建子模块Spark-SQL&#xff0c;并添加依赖 <dependency> <grou…...

django项目之添加资产信息功能

资产信息功能添加 目录 1.创建表格 2.页面展示 3.新增和修改 4.删除 这篇文章的内容, 就是在前面做的基础上, 新增一个资产管理功能, 其实就和之前的部门信息还有员工信息差不多的, 但是这篇文章里面, 会有些细节的地方, 和之前的不太一样。那下面我们就开始讲述这篇文章…...

macos下 ~/.zshrc~ 和 ~/.zshrc

macos下 ~/.zshrc~ 和 ~/.zshrc ~/.zshrc通常是备份文件或临时文件&#xff0c;可能由编辑器&#xff08;如vim&#xff09;创建&#xff0c;通常可以安全删除&#xff0c;不会影响系统运行。 在Mac下&#xff0c;这种带~后缀的备份文件通常是由以下情况产生&#xff1a; 常…...

Kotlin集合操作陷阱与突围:如何优雅地边遍历边修改MutableList

在Kotlin开发中&#xff0c;MutableList是我们常用的集合类型之一。但当我们需要在遍历列表的同时修改它&#xff08;添加或删除元素&#xff09;时&#xff0c;很多开发者会遇到ConcurrentModificationException异常。本文将详细介绍如何安全高效地实现这一需求。 一、问题场…...

交换机与路由器的默契配合:它们的联系与区别

交换机与路由器的默契配合&#xff1a;它们的联系与区别 一. 交换机与路由器的基本功能1.1 交换机的功能1.2 路由器的功能 二. 交换机和路由器的区别三. 交换机和路由器的联系3.1 数据转发的协作3.2 网络分段与分隔3.3 协同工作提供互联网接入 四. 交换机和路由器的联合应用场景…...

cocos 3D自由世界游戏 - 开发

cocos 3D自由世界游戏 - 开发 序概述第一步 创建环境,XForge 框架基础3D创建思路场景地形树木等环境人物角色角色实现实现代码篇空间管理篇动画逻辑篇按钮实现篇虚拟摇杆多功能按钮移动和目标篇AI实现角色属性以及身份牌篇装备篇结尾序 在同时浅入了unity 和 cocos以来,得到…...

SOME/IP中”客户端消费“及”服务端提供”的解析

先上结论 AREthAddConsumedEventGroup-->客户端的函数-->谁调用 Consumed函数&#xff0c;谁就是消费者 AREthAddProvidedEventGroup-->服务端的函数-->谁调用 Provided函数&#xff0c;谁就是服务端 Server 端&#xff1a;AREthAddProvidedEventGroup → 声明 &…...

视频分析设备平台EasyCVR安防视频管理系统,打造电石生产智能视频监控新体系

一、背景介绍 电石生产中的出炉工序是整个生产流程中最为繁重且危险的环节。在开堵炉眼的过程中&#xff0c;电石极易发生飞溅现象&#xff0c;尤其在进行吹氧操作时&#xff0c;人员灼伤的风险极高。鉴于此&#xff0c;该工序正逐步由传统的人工操作模式向智能化方向转变。然…...

ffmpeg实现视频流抽帧

ffmpeg 实现视频流抽帧 抽取实时视频帧 如果你的实时视频是通过 RTSP、UDP 或其他协议获取的&#xff0c;可以直接调用 FFmpeg 命令来抽取帧。 ffmpeg 命令 示例 1 ffmpeg -i rtsp://your_rtsp_stream_url -vf fps1 -update 1 output.jpg说明&#xff1a; -i rtsp://your…...

VTK知识学习(51)- 交互与Widget(三)

1、概述 从前面的 内容可知&#xff0c;交互器样式(如 vtknteractorStylelmage)主要是根据不同的键盘、鼠标等消息来控制相机(vtkCamera)、Actor 等相关参数&#xff0c;从而达到交互的目的。而在渲染场景中&#xff0c;这些交互器样式是没有表达实体的。也就是说&#xff0c;在…...

蓝桥杯嵌入式开发板结构分析及功能学习笔记

目录 板子结构一览时钟源分析74LS573锁存器按键输入滴答定时器 SysTick串口收发LCD屏幕ADC采样AT24C02(EEPROM)可编程电阻TIM定时器输入捕获DAC 板子结构一览 主控为 **STM32G431RBT6**** 外部晶振频率为 **24MHz IAP下载为** GD32F350C8T6** 时钟源分析 自己配置的STM32Cu…...