public override async Task Send(HttpClientImpl client, Stream redirectionStream) { if (_initialised == false) { await _initTask; } if (redirectionStream == null) { redirectionStream = client.Context.Response.OutputStream; } try { List <Task> sendTasks = new List <Task>(); List <Task> continueTasks = new List <Task>(); CancellationTokenSource source = new CancellationTokenSource(); try { for (int i = 0; i < _chunks.Count; i++) { var chunk = _chunks[i]; MemoryStream outputTo = new MemoryStream(); Task sendTask = chunk.Send(client, outputTo); if (sendTask.Status == TaskStatus.Faulted) { Debug.Assert(chunk.GetType().Name.Contains("CsvChunk")); } sendTasks.Add(sendTask); var continueTask = sendTask.ContinueWith( (previousTask) => { try { if (source.IsCancellationRequested == false) { using (outputTo) { if (previousTask.Status == TaskStatus.RanToCompletion) { outputTo.Position = 0; lock (redirectionStream) { outputTo.CopyTo(redirectionStream); } } } } else { Debug.WriteLine("Cancelled"); } } catch (Exception ex) { source.Cancel(true); } }, source.Token, TaskContinuationOptions.None, TaskScheduler.Current ); continueTasks.Add(continueTask); } foreach (var task in sendTasks) { await task; } foreach (var task in continueTasks) { await task; } TracingChunksSource.TraceEvent(TraceEventType.Verbose, TRACEEVENT_OK, "ParallelChunk"); //bool allCompleted = Task.WaitAll(tasks.ToArray(), 60000, source.Token); //if(allCompleted == false) //{ // TracingChunksSource.TraceEvent(TraceEventType.Warning, TRACEEVENT_TIMEOUT, client.Context.Request.Url); //} } catch (AggregateException aex) { source.Cancel(true); foreach (var ex in aex.InnerExceptions) { Debug.WriteLine(ex.Message); } } catch (OperationCanceledException opcex) { Debug.WriteLine(opcex.Message); } catch (Exception ex) { source.Cancel(true); Debug.WriteLine(ex.Message); } } finally { } }
protected override async Task InternalSend(HttpClientImpl client, Stream outputStream) { try { var sendCount = Interlocked.Increment(ref _sendCount); TracingChunksSource.TraceInformation("SendCount: {0}", sendCount); CsvProcessor.Payload payload = new App.Messaging.CsvProcessor.Payload() { IsRequest = true, Sql = _sql }; var payloadData = CsvProcessor.Payload.Serialize(payload); var peerInfo = Root.ServiceBusInstance.GetLocalService <IPeerManager>().FindRandomPeerForAddress("csvHandler"); if (peerInfo == null) { throw new Exception("No peer was found."); } ServiceBusMessage message = new ServiceBusMessage("csvHandler", payloadData, DataFormatEnum.BinaryNet, peerInfo.Name); var replyReference = new Reference <ReplyTask <App.Messaging.CsvProcessor.Payload> >(); TimeSpan started = Watch.Elapsed; Root.ServiceBusInstance.SendAsync(message, replyReference); await outputStream.WriteAsync(TextAreaStart, 0, TextAreaStart.Length); byte[] timeData = System.Text.Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString()); await outputStream.WriteAsync(timeData, 0, timeData.Length); await outputStream.WriteAsync(NewLine, 0, NewLine.Length); try { var csvResult = await replyReference.Item; var ended = Watch.Elapsed; TimeSpan duration = (ended - started); if (duration.TotalSeconds > 1) { TracingChunksSource.TraceInformation(duration.TotalSeconds.ToString("0.000"), "CsvChunk.WaitReplyTime"); } byte[] data = System.Text.Encoding.UTF8.GetBytes(replyReference.Item.ReplyMessage.Originator); await outputStream.WriteAsync(data, 0, data.Length); await outputStream.WriteAsync(NewLine, 0, NewLine.Length); foreach (var line in csvResult.Result) { data = System.Text.Encoding.UTF8.GetBytes(line); await outputStream.WriteAsync(data, 0, data.Length); await outputStream.WriteAsync(NewLine, 0, NewLine.Length); } } catch (OperationCanceledException ex) { var data = System.Text.Encoding.UTF8.GetBytes(ex.Message); outputStream.Write(data, 0, data.Length); } await outputStream.WriteAsync(TextAreaEnd, 0, TextAreaEnd.Length); } catch (Exception ex) { TracingChunksSource.TraceData(TraceEventType.Error, TRACEEVENT_ERROR, ex); } }