我无法将我的 BrokeredMessage 标记为 Complete。
按预期工作的简单代码:
private void OnMessageArrived(BrokeredMessage message)
{
var myObj= message.GetBody<MyObject>();
//do things with myObj
message.Complete();
}
当我尝试等待用户完成 myObj 时,出现异常:
brokeredmessage has been disposed
代码如下:
private Dictionary<long, BrokeredMessage> ReceivedMessages;
ReceivedMessages = new Dictionary<long, BrokeredMessage>();
private void OnMessageArrived(BrokeredMessage message)
{
var myObj= message.GetBody<MyObject>();
ReceivedMessages.Add(myObj.Id, message);
//do things with myObj
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// get myObj on which user clicked
ReceivedMessages[myObj.Id].Complete();
ReceivedMessages.Remove(myObj.Id);
}
在我看来,ServiceBus 以某种方式失去了与 c# 中实际对象的连接
类似于 EF 中的分离对象,只是在这种情况下对象与 ServiceBus 分离
编辑:
只有在用户单击按钮后才将消息标记为完整对我来说很重要。 万一 AC 出现故障(或类似情况),我希望消息仍保留在Service Bus Topic 上,这样下次用户启动应用时,他将再次收到他未处理的消息。
最佳答案
您不应存储中介消息本身。当您调用 .Complete() 方法时,会发生以下情况 according to the documentation :
完成消息的接收操作并指示消息应标记为已处理和删除
您应该做的是将 MyObject 类型的对象存储在您的字典中,因为代理消息将在完成后被销毁。
private Dictionary<long, MyObject> ReceivedMessages;
ReceivedMessages = new Dictionary<long, MyObject>();
在相关的代码中:
var myObj= message.GetBody<MyObject>();
ReceivedMessages.Add(myObj.Id, myObj);
关于c# - BrokeredMessage 已处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35847496/