跳到主要内容
版本:4.0

应用信使

定义

命名空间:
TouchSocket.Core
安装:
dotnet add package TouchSocket.Core

一、说明

应用信使是在进程内的,行使注册和触发功能的组件。可代替事件,可跨越程序集,可依赖倒置

二、注册

下列演示时,是使用AppMessenger.Default默认实例,实际上,用户可以自己新实例化的AppMessenger

2.1 注册实例

首先让类实例实现IMessageObject接口,然后在实例类中声明异步公共实例方法,并使用AppMessage特性标记。

然后一般情况下,建议在构造函数中,注册消息。

🔄 正在加载代码...
信息

对于实例类,如果构造函数中,没有注册消息,那么在构造函数之后,也可以使用其实例注册消息。

🔄 正在加载代码...

2.2 注册静态方法

注册静态方法,只需在类中直接声明异步公共静态方法,并使用AppMessage特性标记即可。

🔄 正在加载代码...

使用RegisterStatic进行注册

🔄 正在加载代码...

三、触发

触发时,泛型类型,即时返回值类型。

🔄 正在加载代码...

四、注销

当不再需要某个消息订阅时,可以通过Unregister方法进行注销。支持按对象注销和按Token注销两种方式。

4.1 按对象注销

注销指定对象的所有消息订阅。

🔄 正在加载代码...

4.2 按Token注销

也可以直接通过Token来注销特定的消息订阅。

AppMessenger.Default.Unregister("Add");

五、高级功能

5.1 允许多个订阅

默认情况下,同一个Token只能注册一次。如果需要让多个对象订阅同一个消息,需要设置AllowMultiple属性为true

🔄 正在加载代码...

5.2 检查消息是否可发送

可以使用CanSendMessage方法检查某个Token是否已经被注册。

if (AppMessenger.Default.CanSendMessage("Add"))
{
var result = await AppMessenger.Default.SendAsync<int>("Add", 10, 20);
}

5.3 获取所有已注册的消息

可以通过GetAllMessage方法获取所有已注册的消息Token。

var allMessages = AppMessenger.Default.GetAllMessage();
foreach (var token in allMessages)
{
Console.WriteLine($"已注册的消息: {token}");
}

5.4 清除所有订阅

使用Clear方法可以清除所有已注册的消息订阅。

AppMessenger.Default.Clear();

六、注意事项

  1. 弱引用机制: AppMessenger内部使用弱引用保存订阅者,避免强引用导致的内存泄漏。如果订阅对象被回收,相关的订阅也会自动失效。

  2. 异步方法: 所有标记为AppMessage的方法都应该是异步方法,返回TaskTask<T>

  3. Token命名: 如果不显式指定Token,将使用方法名作为Token。也可以通过AppMessage特性的参数自定义Token:

    [AppMessage("CustomToken")]
    public Task<int> MyMethod(int a, int b) { ... }
  4. 实例生命周期: 建议在对象构造函数中注册消息,并确保对象在需要接收消息期间保持存活。

  5. 线程安全: AppMessenger是线程安全的,可以在多线程环境中安全使用。