.NET MAUI实战 MessagingCenter

1.概要

在.NET MAUI提供了消息机制,该机制为订阅/发布模式。发布-订阅模式是一种消息传递模式,在此模式下,发布者可在无需知道任何接收方(称为订阅方)的情况下发送消息。同样,订阅方可在不了解任何发布方的情况下侦听特定消息。

.NET 中的事件可实现发布-订阅模式,如果不需要松散耦合(例如控件和包含它的页面),则这些事件是通信层在组件之间最简单直接的方法。但是,发布服务器和订阅服务器的生存期通过对象引用彼此耦合,而订阅服务器类型必须引用发布服务器类型。这可能会造成内存管理问题,尤其是在订阅静态或长期对象事件的对象生存期较短时。如果不删除事件处理程序,则订阅服务器通过在发布服务器中引用它来保持活动状态,这将阻止或延迟订阅服务器的垃圾回收。

.NET 多平台应用 UI (.NET MAUI) MessagingCenter 类实现发布-订阅模式,允许在无法按对象和类型引用链接的组件之间实现基于消息的通信。这种机制允许发布方和订阅方在没有彼此引用的情况下进行通信,这有助于减少它们之间的依赖关系。

MessagingCenter 类提供多播发布-订阅功能。这意味着可以有多个发布方发布单个消息,并且可能有多个订阅方正在侦听同一消息:

8defc6189698775a4341cc5afd512902.png

发布方使用 MessagingCenter.Send 方法发送消息,而订阅方使用 MessagingCenter.Subscribe 方法侦听消息。此外,订阅方还可以使用 MessagingCenter.Unsubscribe 方法取消消息订阅(如果需要)。

本期分享内容:

1.发布消息

2.订阅消息

3.取消订阅

2.详细内容

需要使用之前我们来看看,该对机制的定义方便我们了解并使用。

public class MessagingCenter : IMessagingCenter{public MessagingCenter();public static IMessagingCenter Instance { get; }//发布消息public static void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class;public static void Send<TSender>(TSender sender, string message) where TSender : class;public static void Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null) where TSender : class;//订阅消息public static void Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source = null) where TSender : class;//取消订阅public static void Unsubscribe<TSender, TArgs>(object subscriber, string message) where TSender : class;public static void Unsubscribe<TSender>(object subscriber, string message) where TSender : class;}

本次我们使用的方法为,Send、Subscribe、Unsubscribe,使用顺序为:

  • 1.先定义发送(Send)

  • 2.再定义接收订阅(Subscribe)

  • 3.最后离开当前页面或不再使用取消订阅(Unsubscribe)

8803b43703fab8b46d24e8b9d5ec36a7.png

public partial class MainPage : ContentPage
{private const string MessageChannel = "MY_CHANNEL";public MainPage()
{InitializeComponent();Loaded += OnPageLoaded;Unloaded += OnPageUnloaded;}private void OnPageLoaded(object sender, EventArgs e){//2.订阅消息MessagingCenter.Subscribe<MainPage, string>(this, MessageChannel, (sender, arg) =>{/**1.如果不需要接收来自MainPage对象,可以将sender is MainPage 进行判断如果是MainPage发送的那么则不处理。*  因为发送消息的地方可以有多个,也有可能是NewPage1发送使用该通道发送消息。*2.arg就是返回给订阅方的消息内容“Hey juster!”*/DisplayAlert("Message", arg, "ok");});}private void OnPageUnloaded(object sender, EventArgs e){//3.取消订阅消息,如果不使用该消息频道一定需要释放,用时再重新创建订阅。它是强引用会一直占用资源存在MessagingCenter对象中。MessagingCenter.Unsubscribe<MainPage>(this,MessageChannel);}private void BtnPage2_Clicked(object sender, EventArgs e)
{/** 1.发送消息* <MainPage,string>:MainPage是发送消息的对象,string 是约束需要发送参数的类型。* (this, MessageChannel,"Hey juster !")  :this是发送方的对象引用,MessageChannel 可以理解为一个消息通道,只要订阅这个消息通道的地方都能收到这里发送的消息内容,"Hey juster !" 就是消息内容为string类型的消息。*/MessagingCenter.Send<MainPage,string>(this, MessageChannel,"Hey juster!");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷——P1033 自由落体

https://www.luogu.org/problem/show?pid1033#sub 题目描述 在高为 H 的天花板上有 n 个小球&#xff0c;体积不计&#xff0c;位置分别为 0&#xff0c;1&#xff0c;2&#xff0c;…&#xff0e;n-1。在地面上有一个小车&#xff08;长为 L&#xff0c;高为 K&#xff0c;距…

java 接口防刷_java轻量级接口限流/防刷插件

简介call-limit提供接口限流、防刷的功能&#xff0c;插件基于spring开发&#xff0c;在应用应用的任何一个逻辑层皆可使用(web、service、dao)&#xff0c;插件支持单机应用下的限流和分布式应用的限流(分布式应用限流需要依赖redis)&#xff0c;在简单业务场景下插件可为大家…

【leetcode】521. Longest Uncommon Subsequence I

题目如下&#xff1a; 解题思路&#xff1a;本题有点意思。首先如果输入的两个字符串都为空&#xff0c;那么结果是-1&#xff1b;如果两个字符串长度不一样&#xff0c;那么结果是较长的字符串的长度&#xff0c;因为较长的字符串肯定是自身的子序列&#xff0c;但一定不是较短…

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?...

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍&#xff1f;独立观察员 2022 年 9 月 4 日在编写 “Wifi 固定器 [1]” 程序时&#xff0c;按如下方式使用了定时器&#xff1a;// 声明&#xff1b; private Timer _Timer new Timer() { …

JS魔法堂:判断节点位置关系

一、前言                           在polyfill querySelectorAll 和写弹出窗时都需要判断两个节点间的位置关系&#xff0c;通过jQuery我们可以轻松搞定&#xff0c;但原生JS呢&#xff1f;下面我将整理各种判断方法&#xff0c;以供日后查阅。 二…

ChartCtrl源码剖析之——CChartAxis类

CChartAxis类用来绘制波形控件的坐标轴&#xff0c;这个源码相对较复杂&#xff0c;当初阅读的时候耗费了不少精力来理解源码中的一些实现细节。 CChartAxis类的头文件。 #if !defined(AFX_CHARTAXIS_H__063D695C_43CF_4A46_8AA0_C7E00268E0D3__INCLUDED_) #define AFX_CHARTA…

基于.net开发的自助餐饮系统

本文系 EMQ&Intel 联合举办的首届“中国物联网数据基础设施最佳案例评选大赛“个人开发者赛道一等奖作品。项目简介智能餐饮自助结算系统是一个由称重系统、显示屏、自助扫码盒和 Intel CPU 组成的智能自助结算终端&#xff0c;将装有菜品的托盘放到秤盘上结算&#xff0c;…

java打包维护_java打包详解

from yahh2008的blog: http://www.matrix.org.cn/blog/yahh2008/兄弟&#xff0c;对java着迷吗&#xff0c;或者是为了自己的生计&#xff0c;不论怎样都欢迎你进入精彩java世界&#xff0c;welcome&#xff01;可能你刚刚对每个人说&#xff1a;Hello World&#xff01;也或者…

Linux高级文本处理之sed(三)

sed高级命令sed允许将多行内容读取到模式空间&#xff0c;这样你就可以匹配跨越多行的内容。本篇笔记主要介绍这些命令&#xff0c;它们能够创建多行模式空间并且处理之。其中&#xff0c;N/D/P这三个多行命令分别对应于小写的n/d/p命令&#xff0c;后者我们在上一篇已经介绍。…

如何在 C# 程序中注入恶意 DLL ?

一&#xff1a;背景 前段时间在训练营上课的时候就有朋友提到一个问题&#xff0c;为什么 Windbg 附加到 C# 程序后&#xff0c;程序就处于中断状态了&#xff1f;它到底是如何实现的&#xff1f;其实简而言之就是线程的远程注入&#xff0c;这一篇就展开说一下。二&#xff1a…

练习题|网络编程-socket开发

原文&#xff1a;https://www.cnblogs.com/shengyang17/p/8822745.html 1、什么是C/S架构&#xff1f; C指的是client&#xff08;客户端软件&#xff09;&#xff0c;S指的是Server&#xff08;服务端软件&#xff09;&#xff0c;C/S架构的软件&#xff0c;实现服务端软件与客…

ABP vNext微服务架构详细教程(补充篇)——单层模板(上)

简介在之前的《ABP vNext微服务架构详细教程》系列中&#xff0c;我们已经构建了完整的微服务架构实例&#xff0c;但是在开发过程中&#xff0c;我们会发现每个基础服务都包含10个类库&#xff0c;这是给予DDD四层架构下ABP的实现方案&#xff0c;但是实际使用中我们会发现&am…

mybatis源码学习(三):MappedStatement的解析过程

我们之前介绍过MappedStatement表示的是XML中的一个SQL。类当中的很多字段都是SQL中对应的属性。我们先来了解一下这个类的属性&#xff1a; public final class MappedStatement {private String resource;private Configuration configuration;//sql的IDprivate String id;//…

C# 二十年语法变迁之 C# 8参考

C# 二十年语法变迁之 C# 8参考自从 C# 于 2000 年推出以来&#xff0c;该语言的规模已经大大增加&#xff0c;我不确定任何人是否有可能在任何时候都对每一种语言特性都有深入的了解。因此&#xff0c;我想写一系列快速参考文章&#xff0c;总结自 C# 2.0 以来所有主要的新语言…

windows 提权 cve-2018-8897

windows 提权 cve-2018-8897影响范围&#xff1a;基本上是全版本具体影响范围看详情&#xff1a;https://portal.msrc.microsoft.co … isory/CVE-2018-8897http://www.o2oxy.cn/wp-content/uploads/2018/06/cve-2018-8897.rar转载于:https://blog.51cto.com/9861015/2126608

java servlet练习测试

步骤&#xff1a; 0、首先创建web project&#xff0c;工程名&#xff1a;test_servlet 1、编写Servlet&#xff0c;TestServlet.java文件内容&#xff1a; package com.ouyang.servlet;import java.io.IOException; import java.sql.Connection; import java.sql.DriverManage…

《ASP.NET Core 6框架揭秘》实例演示[19]:数据加解密与哈希

数据保护&#xff08;Data Protection&#xff09;框架旨在解决数据在传输与持久化存储过程中的一致性&#xff08;Integrity&#xff09;和机密性&#xff08;confidentiality&#xff09;问题&#xff0c;前者用于检验接收到的数据是否经过篡改&#xff0c;后者通过对原始的数…

如何在ABAP Netweaver和CloudFoundry里记录并查看日志

Netweaver 要记录日志需要有一个checkpoint group&#xff0c;可以自行创建也可以使用标准的。这里我重用标准的group&#xff1a;DEMO_CHECKPOINT_GROUP。 tcode SAAB&#xff0c;点Display <->Activate进入编辑模式&#xff0c;将Logpoints设置为"Log"&#…

如何成为有效学习的高手(许岑)——思维导图

总结自许岑精品课《如何成为有效学习的高手》&#xff0c;图片看不清的可以看下面。 最后有彩蛋&#xff01;最后有彩蛋&#xff01;最后有彩蛋&#xff01; 定义 高效学习的定义&#xff1a;找到最适合自己的学习手法&#xff0c;在相对短的时间内集中注意力&#xff0c;以解决…

WPF Canvas 平滑笔迹

WPF Canvas 平滑笔迹控件名&#xff1a;CanvasHandWriting作者&#xff1a;小封&#xff08;邝攀升&#xff09;原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers编辑&#xff1a;驚鏵完整的思路如下收集路径点集。平均采样路径点集。将路径点集转为…