You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用WeakReferenceMessenger向异步回调发送带值消息?

实现带值的异步WeakReferenceMessenger消息

1. 自定义带值的请求消息类

CollectionRequestMessage本身是为多响应场景设计的,且没有内置值传递属性。我们可以自定义一个支持携带参数的消息类,按需选择继承RequestMessage<TResponse>(一对一响应)或CollectionRequestMessage<TResponse>(多响应):

一对一异步响应消息

public class ValueRequestMessage<TValue, TResponse> : RequestMessage<TResponse>
{
    public TValue Value { get; }

    public ValueRequestMessage(TValue value)
    {
        Value = value;
    }
}

多响应异步消息(匹配你之前的Collection场景)

public class ValueCollectionRequestMessage<TValue, TResponse> : CollectionRequestMessage<TResponse>
{
    public TValue Value { get; }

    public ValueCollectionRequestMessage(TValue value)
    {
        Value = value;
    }
}

2. 扩展IMessenger的异步注册方法

针对自定义的带值消息,扩展注册方法以支持带参数的异步回调:

public static partial class IMessengerExtensions
{
    // 一对一请求消息的异步注册
    public static void Register<TValue, TResponse>(this IMessenger messenger, object recipient, Func<TValue, Task<TResponse>> asyncAction)
        where TResponse : notnull
    {
        messenger.Register<ValueRequestMessage<TValue, TResponse>>(recipient, async (r, m) =>
        {
            var response = await asyncAction(m.Value);
            m.Reply(response);
        });
    }

    // 多响应集合消息的异步注册
    public static void RegisterCollection<TValue, TResponse>(this IMessenger messenger, object recipient, Func<TValue, Task<TResponse>> asyncAction)
        where TResponse : notnull
    {
        messenger.Register<ValueCollectionRequestMessage<TValue, TResponse>>(recipient, async (r, m) =>
        {
            var response = await asyncAction(m.Value);
            m.Reply(response);
        });
    }
}

3. 注册与发送示例

一对一异步带值消息

  • 注册回调:
// 示例:接收string参数,异步返回int类型结果
WeakReferenceMessenger.Default.Register<string, int>(this, async (input) =>
{
    await Task.Delay(100); // 模拟异步操作
    return input.Length;
});
  • 发送消息并获取响应:
var message = new ValueRequestMessage<string, int>("Hello World");
int result = await WeakReferenceMessenger.Default.Send(message);
// result值为11

多响应异步带值消息

  • 注册回调:
WeakReferenceMessenger.Default.RegisterCollection<string, Task>(this, async (input) =>
{
    await Task.Delay(100);
    Console.WriteLine($"处理带值消息:{input}");
    return Task.CompletedTask;
});
  • 发送消息:
var message = new ValueCollectionRequestMessage<string, Task>("Hello Async Collection");
WeakReferenceMessenger.Default.Send(message);

可选方案:复用现有CollectionRequestMessage

如果想直接基于你之前的MyMessage扩展,只需给消息类添加Value属性:

public class MyMessageWithValue : CollectionRequestMessage<Task>
{
    public string Value { get; }

    public MyMessageWithValue(string value)
    {
        Value = value;
    }
}

然后针对性扩展注册方法:

public static void RegisterMyMessageWithValue(this IMessenger messenger, object recipient, Func<string, Task> asyncAction)
{
    messenger.Register<MyMessageWithValue>(recipient, async (r, m) =>
    {
        await asyncAction(m.Value);
        m.Reply(Task.CompletedTask);
    });
}

注册与发送:

// 注册
WeakReferenceMessenger.Default.RegisterMyMessageWithValue(this, async (value) =>
{
    await Task.Delay(200);
    Console.WriteLine($"处理消息值:{value}");
});

// 发送
WeakReferenceMessenger.Default.Send(new MyMessageWithValue("Hello Custom Collection"));

内容的提问来源于stack exchange,提问作者bcl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:59:58