Mam problem z oznaczeniem mojej BrokeredMessage jako zakończoną.BrokeredMessage disposed
prosty kod, który działa jak oczekiwano:
private void OnMessageArrived(BrokeredMessage message)
{
var myObj= message.GetBody<MyObject>();
//do things with myObj
message.Complete();
}
Kiedy próbuję czekać na użytkownika, aby zakończyć myObj otrzymuję wyjątek:
brokeredmessage został umieszczony
Kod poniżej:
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);
}
Dla mnie to wygląda ServiceBus jakoś tracą połączenie z rzeczywistego obiektu w C#
Coś podobnego do wolnostojącego obiektu w EF, tylko w tym przypadku celem jest odłączana od ServiceBus
EDYTOWANIE:
Ważne jest, aby zaznaczyć wiadomość jako kompletną dopiero po kliknięciu przycisku użytkownika. W przypadku awarii AC (lub podobnych rzeczy) chcę, aby wiadomości nadal pozostały na Temacie usługi magistrali, aby przy następnym uruchomieniu aplikacji użytkownik ponownie otrzymywał wiadomości, których nie przetworzył.
Czy mogliby Państwo polecić rozwiązanie tego problemu: a następnie: 1. Otrzymana wiadomość, jej dane podzielone na części i przesłane do przetwarzania asynchronicznego. Chcemy zablokować wiadomość, dopóki jej dane nie zostaną przetworzone przez użytkownika, który ją nabył. 2. Jeśli wystąpi wyjątek lub użytkownik opuści program, odblokuj wiadomość, aby inny użytkownik mógł ją przetworzyć później. 3. Jeśli/kiedy przetwarzany jest ostatni fragment danych, usuń wiadomość z ServiceBus, ponieważ jej dane zostały poprawnie przetworzone. – ErroneousFatality
Tak. Przestań wywoływać funkcję Complete() w wiadomości, dopóki nie skończysz. –
Przepraszam, jeśli się mylę, ale właśnie to robi OP. Zapisuje wiadomość w słowniku, aby mógł wywołać polecenie Complete po zakończeniu przetwarzania asynchronicznego. Zalecamy, aby zamiast tego zrobić to i zapisać tylko dane, które przetwarza. Jak nazwałby to "Complete" wiadomością po procesie asynchronicznym? – ErroneousFatality