c#中通过 Easy.MessageHub实现类似aardio的subsciribe和publish功能
一直觉得aardio里的订阅功能很好用, 一对多 / 多对一, 减少了系统间的耦合,
那么在c#中应该怎么实现呢?
最简单的方法是调用 Easy.MessageHub 程序集
开源地址 https://github.com/NimaAra/Easy.MessageHub
源码本地下载:
1.声明一个静态类, 存储公共头
internal class comPS { public static IMessageHub hub = new MessageHub(); }
2. Form1中订阅
public Form1() { CheckForIllegalCrossThreadCalls = false; InitializeComponent(); comPS.hub.Subscribe<string>(p => { textBox1.Text = p; button1.Text = p; }); }
3. from2中发布
private void button1_Click(object sender, EventArgs e) { comPS.hub.Publish<string>("com form 2"); }
如果需要区分不同的消息处理不同的功能, 那么可以订阅里判定接收到的string
升级类库到了.net8.0,
工程源码如下:
链接:https://pan.baidu.com/s/10sGPqWq0fFgpMZgKmb4HoA?pwd=nr96
提取码:nr96
hub.Publish(new Person { Id = "Foo" }); hub.Publish("An important message");
好吧,我查了下gpt
Delegate(代理)在C#中用于封装对方法的引用。它允许将方法视为可分配给变量或作为参数传递的实体。delegate关键字用于定义delegate类型。它指定可由该delegate封装的方法的返回类型和参数。例如:
这个delegate可以封装接受两个int并返回int的任何方法。使用delegate的步骤:1. 定义delegate类型,指定方法签名;2. 声明delegate变量;3. 将方法赋值给delegate变量;4. 调用delegate变量就像调用方法一样;5. 实际调用的将是delegate变量封装的方法。示例:
这里我们定义了一个MathDelegate delegate类型,用于封装接受两个int并返回int的方法。然后我们创建两个该delegate类型的变量delegate1和delegate2,并将Add和Sub方法分别赋值给它们。最后调用delegate1和delegate2就像调用Add和Sub方法一样,实际上调用的也是这两个方法。所以delegate允许我们将方法视为可传递和执行的实体,从而实现回调和事件处理等功能。
回复#7 @admin :
Delegate的使用方法见主窗体代码注释。
假设我的程序里有2个窗体,我希望在一个子窗体中控制另一个子窗体的显示
子窗体1:
子窗体2:
主窗体:
主窗体代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TabWinForm { public partial class Form1 : Form { private Point mPoint; FormTab1 formTab1; FormTab2 formTab2; //1. 定义委托,可以直接使用 Action<T> 或者 Func<T> 内建的委托类型,省略步骤1. //public delegate void ChangeLogoDelegate(string logo); //2. 构建委托的方法 public void ChangeLogo(string logo) { formTab1.txtUrl.Text = logo; } //3. 创建委托变量(哪里使用,哪里创建)【见子窗体】 //4. 使用委托 【见子窗体】 public Form1() { InitializeComponent(); formTab1 = new FormTab1(); formTab1.TopLevel = false; formTab1.Dock = DockStyle.Fill; formTab2 = new FormTab2(); formTab2.TopLevel = false; formTab2.Dock = DockStyle.Fill; btnTab1_MouseClick(null, null); //5. 关联委托 formTab2.changeLogo += ChangeLogo; } private void btnClose_Click(object sender, EventArgs e) { this.Close(); } private void btnMin_Click(object sender, EventArgs e) { this.WindowState = FormWindowState.Minimized; this.notifyIcon1.Visible = true; } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.WindowState = FormWindowState.Normal; this.notifyIcon1.Visible = false; } private void btnTab1_MouseClick(object sender, MouseEventArgs e) { btnTab2.BackColor = Color.DodgerBlue; btnTab1.BackColor = Color.Navy; splitContainer2.Panel2.Controls.Clear(); formTab1.Parent = splitContainer2.Panel2; formTab1.Show(); } private void btnTab2_MouseClick(object sender, MouseEventArgs e) { btnTab1.BackColor = Color.DodgerBlue; btnTab2.BackColor = Color.Navy; splitContainer2.Panel2.Controls.Clear(); formTab2.Parent = splitContainer2.Panel2; formTab2.Show(); } private void splitContainer1_Panel1_MouseDown(object sender, MouseEventArgs e) { mPoint = new Point(e.X, e.Y); } private void splitContainer1_Panel1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { this.Location = new Point(this.Location.X+e.X-mPoint.X, this.Location.Y+e.Y-mPoint.Y); } } private void btnTab1_MouseHover(object sender, EventArgs e) { slide.Top = btnTab1.Top; } private void btnTab2_MouseHover(object sender, EventArgs e) { slide.Top = btnTab2.Top; } } }
子窗体1代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TabWinForm { public partial class FormTab1 : Form { string text; public FormTab1() { InitializeComponent(); } private void btnGet_ClickAsync(object sender, EventArgs e) { var request = new HttpRequestMessage(HttpMethod.Get, txtUrl.Text); request.Headers.UserAgent.ParseAdd("Mozilla"); var client = new HttpClient(); var response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result; txtResult.Text = response.Content.ReadAsStringAsync().Result; } } }
子窗体2代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static TabWinForm.FormTab1; namespace TabWinForm { public partial class FormTab2 : Form { //3. 创建委托变量 public Action<string> changeLogo; public FormTab2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //4. 使用委托 changeLogo(@"https://www.baidu.com"); } } }
登录后方可回帖
??aardio里的订阅功能???
有什么订阅功能?