private async Task StartDequeuingMarkedItems(MarkedDelegate onSuccess = null, MarkedDelegate onFailure = null) { try { if (_markedMessagesQueue.Count > 0) { ProductMarkChangedMessage msg = null; lock (_markedMessagesQueue) { msg = _markedMessagesQueue.Dequeue(); } var succeeded = await MarkProductAsFavorite(msg.Model.GroupId, msg.Model.Id, msg.Marked); if (succeeded) { _previuosTryWasFailure = false; onSuccess?.Invoke(msg.Model.GroupId, msg.Model.Id, msg.Marked); } else { onFailure?.Invoke(msg.Model.GroupId, msg.Model.Id, msg.Marked); if (_previuosTryWasFailure) { foreach (var queuedMsg in _markedMessagesQueue) { onFailure?.Invoke(queuedMsg.Model.GroupId, queuedMsg.Model.Id, queuedMsg.Marked); } _markedMessagesQueue = new Queue <ProductMarkChangedMessage>(); _markedMessagesDequeuingStarted = false; } _previuosTryWasFailure = true; } await StartDequeuingMarkedItems(onSuccess, onFailure); } else { _markedMessagesDequeuingStarted = false; } } catch (Exception ex) { OnException(ex); } }
public void MarkProductAsFavorite(ProductMarkChangedMessage msg, MarkedDelegate onSuccess = null, MarkedDelegate onFailure = null) { lock (_markedMessagesQueue) { if (!_markedMessagesQueue.Any(x => (!x.Model.GroupId.IsNullOrEmpty() && x.Model.GroupId == msg.Model.GroupId) || x.Model.Id == msg.Model.Id)) { _markedMessagesQueue.Enqueue(msg); } } if (!_markedMessagesDequeuingStarted) { _markedMessagesDequeuingStarted = true; Task.Run(() => StartDequeuingMarkedItems(onSuccess, onFailure)); } }
protected override void OnMarkChangedMsgRecieved(ProductMarkChangedMessage msg) { //обрабатываем только удаление товара if (msg.Marked) return; var product = msg.Model; InvokeOnMainThread(() => { Items.Remove(Items.FirstOrDefault(p => p.Model.Id == product.Id && p.Model.GroupId == product.GroupId)); Empty = Items.IsNullOrEmpty(); }); MarkProductVmService.MarkProductAsFavorite(msg, onSuccess: (groupId, productId, isMarked) => { Messenger.Publish(new ProductMarkedQuantityChangedMessage(this)); }); }