Beispiel #1
0
 public virtual void OnTaskFinished()
 {
     if (_onTaskFinished != null)
     {
         if (IsBackgroundTask)
         {
             while (CallBackQueue.Count > 0)
             {
                 CallBackQueue.Dequeue();
                 _onTaskFinished();
             }
         }
         else
         {
             _onTaskFinished();
         }
     }
 }
Beispiel #2
0
        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));
            }
        }