gpt4 book ai didi

c# - "callback dispatcher"组件需要更好的设计

转载 作者:太空狗 更新时间:2023-10-29 23:09:34 26 4
gpt4 key购买 nike

我从客户端应用程序向远程队列发送请求/事务(包含要执行的操作(和参数)+ transactionID)。远程服务器在某个时刻将请求从队列中取出,并需要一些时间来处理它。

一旦完成处理,它就会在客户端队列中发送一个响应(包含应用响应 + transactionID)......所以这是一个完全“断开连接”的通信模式,客户端可以映射的唯一方法对请求的响应是通过 transactionID。

消息响应在客户端出队,并与原始请求匹配(基于 transactionID)。

我现在正在做的是,当客户端将请求发布到服务器队列时,它会向保留 transactionId 和回调(委托(delegate))的字典添加回调。这是 Dictionary<int, object>将 transactionId 映射回回调以调用操作结果。

回调/委托(delegate)存储为对象,因为根据请求,回调委托(delegate)签名不同(例如,响应可能返回 List<string> 而另一个响应可能返回 int)。

当客户端队列将响应出队时,它知道响应的类型(因此知道回调的相应签名),因此它根据 transactionID 从字典中获取回调。然后它将对象转换回相应的委托(delegate)类型并调用回调。

我发现这种方法不是很“性感”,但我真的没有看到执行此类任务的另一种方法。

有没有更好的方法来执行此操作?

如果问题不够清楚,请告诉我,我们会通过一些编辑来澄清。

最佳答案

您可能会发现 Reactive Extensions 是用于此类消息传递的便捷工具。

首先,让您的所有响应都实现一些接口(interface)或基类,例如 IMessage。每种响应都应该像这里一样封装在一个单独的类中

public interface IMessage
{
int TransactionId { get; }
}

public class UserListMessage : IMessage
{
int TransactionId { get; set; }
public List<string> Users { get; set; }
}

然后让你的消息队列实现IObservable<IMessage> .响应式扩展提供了一个随时可用的实现,称为 Subject<T> ,您可能想要包装它或其他东西。

Observable 实现了一个 Subscribe(IObserver<IMessage> observer)将观察者存储在内部列表中某处的方法。当新响应到达时 OnNext(IMessage message)在每个订阅的观察者上调用方法。

最后,您的响应处理注册代码可能如下所示:

var subscription = myQueue
.OfType<UserListMessage>()
.Where(msg => msg.TransactionId == id)
.Subscribe(callback);

这将为具有给定事务 ID 的 UserListMessage 类型的消息注册回调。可能您还想在某个地方退订。那将是:

subscription.Dispose();

这是一个简短的示例,使用 Rx 会是什么样子。现在去找一些更详细的教程。

关于c# - "callback dispatcher"组件需要更好的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11370416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com