public virtual void OnTaskFinished() { if (_onTaskFinished != null) { if (IsBackgroundTask) { while (CallBackQueue.Count > 0) { CallBackQueue.Dequeue(); _onTaskFinished(); } } else { _onTaskFinished(); } } }
private Result <TResponse> Call <TRequest, TResponse>(TRequest message, Func <QueueingBasicConsumer, BasicDeliverEventArgs> dequeue) where TRequest : class, new() where TResponse : class, new() { try { //Console.WriteLine("[" + Thread.CurrentThread.ManagedThreadId + "]线程启动调用。"); //Stopwatch st = new Stopwatch(); //st.Start(); Task <string> mainTask = new Task <string>(() => { IBasicProperties requestProperties; lock (lok2) { EnsureExchangeAndQueue(); requestProperties = CreateBasicProperties(); _channel.Value.QueueDeclare(replyTo, false, false, true, null); } requestProperties.CorrelationId = Guid.NewGuid().ToString(); requestProperties.ReplyTo = replyTo; //Task task1 = Task.Factory.StartNew(() => //{ if (Interlocked.Read(ref _isRunCallBack) < 1) { Interlocked.Increment(ref _isRunCallBack); var consumer = new EventingBasicConsumer(_callBackChannel.Value); consumer.Received += (c, result) => { Task.Factory.StartNew(() => { // Console.WriteLine("[" + Thread.CurrentThread.ManagedThreadId + "]do:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")); if (null != result && null != result.BasicProperties && !string.IsNullOrEmpty(result.BasicProperties.CorrelationId)) { CallBackQueue.Add(result.BasicProperties.CorrelationId, Encoding.UTF8.GetString(result.Body)); } if (Configuration.QueueAcknowledgeReciept) { _callBackChannel.Value.BasicAck(result.DeliveryTag, false); } }); }; _callBackChannel.Value.BasicConsume(replyTo, !Configuration.QueueAcknowledgeReciept, consumer); } //}); //Task.WaitAny(task1); _channel.Value.BasicPublish( Configuration.ExchangeName, BuildRoutingKey(message), requestProperties, Encoding.UTF8.GetBytes(_serializer.Serialize(message))); return(CallBackQueue.Get(requestProperties.CorrelationId)); //st.Stop(); //Console.WriteLine("["+requestProperties.CorrelationId + "]wanc,haoshi:" + st.ElapsedMilliseconds); // return new Result<TResponse>(_serializer.Deserialize<TResponse>(tmp)); }); mainTask.Start(); return(new Result <TResponse>(_serializer.Deserialize <TResponse>(mainTask.Result))); } catch (Exception exception) { if (Configuration.ExceptionHandler == null) { throw; } Configuration.ExceptionHandler(exception); return(new Result <TResponse>(exception)); } }