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里的订阅功能???
有什么订阅功能?