2015-03-20 2 views
2

Я использую адаптер для очереди служебной шины. Поэтому я не должен использовать какой-либо класс очереди для возвращаемого типа. Но я застрял на методе ReceiveAsync(). Как я могу отобразить Task<BrokeredMessage> to Task<MyAdapterClass>?Очередь служебной шины как сопоставить задачу <BrokeredMessage> с задачей <MyClass>

Вот адаптер класса для BrokeredMessage

public class QueueMessage : IQueueMessage 
    { 
     private BrokeredMessage _message; 
     public T Body<T>() 
     { 
      T result = default(T); 
      if (_message != null) 
       result = _message.GetBody<T>(); 
      return result; 

     } 
     public BrokeredMessage Message { set { _message = value; } } 

     public string Label 
     { 
      get 
      { 
       var result = ""; 
       if (_message != null) 
        result = _message.Label; 
       return result; 
      } 
     } 

     public void MoveToDeadLetter() 
     { 
      if (_message != null) 
       _message.DeadLetter(); 
     } 

     public void Complete() 
     { 
      if (_message != null) 
       _message.Complete(); 

     } 


     public async void CompleteAsync() 
     { 
      if (_message != null) 
       await _message.CompleteAsync(); 

     } 

     public async void AbandonAsync() 
     { 
      if (_message != null) 
       await _message.AbandonAsync(); 

     } 
     public void Abandon() 
     { 
      if (_message != null) 
       _message.Abandon(); 
     } 

     public string MessageId 
     { 
      get 
      { 
       return _message == null ? null : _message.MessageId; 
      } 
      set { if (_message != null) _message.MessageId = value; } 
     } 

     public string CorrelationId 
     { 
      get 
      { 
       return _message == null ? null : _message.CorrelationId; 
      } 
      set { if (_message != null) _message.CorrelationId = value; } 
     } 

     public int DeliveryCount { get { return _message == null ? -1 : _message.DeliveryCount; } } 
    } 

И я хочу метод, как этот

public Task<IQueueMessage> ReceiveAsync(TimeSpan serverWaitTime) 
     { 

      Task<QueueMessage> task= QueueClient.ReceiveAsync(serverWaitTime); 

      return task; 
     } 

О проекте драйвера я хочу использовать задачу так:

var task1 = _queueAdapter.ReceiveAsync(new TimeSpan(200)).ContinueWith(ReadMessageAsync); 

ответ

1

Thank you Richard. Я только что улучшил ваш ответ, и это работает хорошо.

public async Task<IQueueMessage> ReceiveAsycn(TimeSpan serverWaitTime) 
     { 
      var task = QueueClient 
             .ReceiveAsync(serverWaitTime) 
             .ContinueWith(bm => bm.Result==null ? null : new QueueMessage { Message=bm.Result}); 
      return await task; 
     }