2016-07-29 2 views
4

я привык работать с языком программирования Scala - с помощью Scala я мог бы карту через фьючерсы, такие как:C# - преобразовать задачу асинхронной от одного типа к другому

val response: Future[HttpResponse] = asyncHttpClient.GetRequest("www.google.com") 

val statusCode: Future[Int] = response.map(r => r.statusCode) 

Недавно я взял работая с C#, и я увидел себя в той же ситуации, что и выше, но я не мог понять, как «сопоставить» задачу.

Вот пример того, что я хочу добиться:

Task<HttpResponseMessage> response = httpClient.GetAsync("www.google.com") 

Task<int> statusCode = response.Map(response => response.StatusCode) 

Благодаря

ответ

5

Самый прямой перевод с существующими методами будут:

Task<int> statusCode = response.ContinueWith(t => t.Result.StatusCode) 

Однако на практике вы почти всегда ждете задания, чтобы получить результат. Возможно, вам стоит заглянуть в async/wait.

+0

По сути, Джон Скит реализовал это, однако, поскольку вы действительно предоставляете мне стандартный метод библиотеки, я приму свой ответ. –

+0

Я думаю, что ответ @Jon Skeet также менее эффективен, потому что он создает машину состояний для ожидания. Не совсем уверен, хотя, может быть, есть некоторые проблемы с ContinueWith, которых я не вижу. – Stilgar

+2

Эта версия будет иметь несколько другую обработку исключений. Ваш будет поднимать «AggrageException», содержащее фактическое исключение, и Джон сделает реальное исключение. –

4

Я немного удивлен, что нет ничего в рамках для этого, чтобы быть честным. (Скорее всего, есть я не видел его.) Вы можете построить его довольно легко, хотя:

public static async Task<TResult> Map<TSource, TResult> 
    (Task<TSource> task, Func<TSource, TResult> selector) 
    => selector(await task); 
+0

Возможно, потому что ContinueWith довольно близко? – Stilgar

+0

Существует целый [LINQ over Tasks] (https://blogs.msdn.microsoft.com/pfxteam/2010/04/04/parallelextensionsextras-tour-1-linq-to-tasks/) эксперимент из дополнительных функций TPL, но он никогда не снимался. –

+0

@Stilgar: Да, это правда. –

Смежные вопросы