public void SetSendResult(RomeAppServiceResponseStatus status) { SendFinished?.Invoke(new PackageManagerSendQueueItemEventArgs { ResponseStatus = status, }); }
private async Task <RomeAppServiceResponse> SendViaMessageCarrier(Dictionary <string, object> data) { int tryCount = 0; var item = new PackageManagerSendQueueItem { RemoteSystemId = nrs.Id, Data = data, }; await sendQueueSemaphore.WaitAsync(); sendQueue.Add(item); sendQueueSemaphore.Release(); TaskCompletionSource <RomeAppServiceResponseStatus> tcs = new TaskCompletionSource <RomeAppServiceResponseStatus>(); item.SendFinished += (e) => { tcs.SetResult(e.ResponseStatus); }; RomeAppServiceResponseStatus result = RomeAppServiceResponseStatus.RemoteSystemUnavailable; Debug.WriteLine("Waiting for Message Carrier to arrive..."); while (tryCount < _maxRetryCount) { result = await tcs.Task.WithTimeout(TimeSpan.FromSeconds(_maxSecondsForCarrier), RomeAppServiceResponseStatus.Unknown); //Timeout if (result == RomeAppServiceResponseStatus.Unknown) { if (tryCount < _maxRetryCount) { Debug.WriteLine("Message Carrier timeout, will retry..."); var connectResult = await Connect(); if (connectResult != RomeAppServiceConnectionStatus.Success) { Debug.WriteLine("Can't connect."); result = RomeAppServiceResponseStatus.RemoteSystemUnavailable; } else { tryCount++; continue; } } else { result = RomeAppServiceResponseStatus.RemoteSystemUnavailable; Debug.WriteLine("Message Carrier didn't arrive :("); } } else { Debug.WriteLine("Message Carrier arrived."); } break; } sendQueue.Remove(item); return(new RomeAppServiceResponse { Message = new Dictionary <string, object>(), Status = result, }); }