2015-04-11 3 views
0

Как я могу обернуть результат метода async в свой собственный класс-оболочку (MyEnvelop) и вернуть его как задачу?Как обернуть результат асинхронного метода

Я использую собственный класс Envelope для возврата результатов из моего компонента Data Access обратно в Business Layer. Это прекрасно работает с методами синхронизации, но как я могу вернуть результат типа MyEnvelope в асинхронном режиме?

Обновлено пример кода:

public async Task<MyEnvelope<Customer>> FindAsync(params object[] keyValues) 
    { 
     using (var nw = new NWRepository()) 
     { 
     Customer result = await nw.DoSomethingAsync<Customer>(keyValues); 
     return // here I would like to return new MyEnvelope<Customer>(result) 
       // wrapped in Task as shown in the signature 
       } 
      } 

ответ

3

То, что вы хотите сделать, это что:

public async Task<MyEnvelope<Customer>> FindAsync(params object[] keyValues) 
{ 
    using (var nw = new NWRepository()) 
    { 
     Customer c = await nw.FindAsync<Customer>(keyValues); 
      return new MyEnvelope<Customer>(c); 
    } 
} 

вы затем вызвать метод так:

MyEnvelope<Customer> customer = await FindAsync(p1, p2, p3); 

Запомнить await вернет ResultTask<T>, который имеет тип T, а не Task сам объект.

+0

Хорошо, я получил AWAIT вещь, но в вашей выборке вы возвращаетесь MyEnvelope , но мне нужно Task > ...? Не уверен, что мы имеем в виду то же самое. Он должен быть MyEnvelope. должен быть завернут в Task >, потому что вызывающий метод ожидает задание – Legends

+0

Нет, если вы не используете ключевое слово async, возвращаемый вами тип это тип внутри задачи. –

+0

Aaaaah, теперь я вижу, я сначала подумал, что это должна быть Task.FromResult. Спасибо! – Legends

0

Невозможно сделать, потому что вам нужно решить задачу, прежде чем вы сможете передать ее MyEnvelope. Самое близкое, что вы можете получить, это удалить ключевые слова async/await, которые разворачивают задачу и получают Task<Customer>.

public Task<Customer> FindAsync(params object[] keyValues) 
{ 
    using (var nw = new NWRepository()) 
    { 
     return nw.DoSomethingAsync<Customer>(keyValues) 
    } 
} 
Смежные вопросы