如何使用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
相关产品推荐
相关产品推荐

