C# - 将异步任务从一种类型转换为另一种类型

Joh*_*n S 6 c# asynchronous

我习惯使用Scala编程语言 - 使用Scala我可以映射未​​来,例如:

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

val statusCode: Future[Int] = response.map(r => r.statusCode)
Run Code Online (Sandbox Code Playgroud)

最近我接受了使用C#的工作,我发现自己与上面的例子情况相同,但我无法弄清楚如何"映射"任务.

这是我想要实现的一个例子:

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

Task<int> statusCode = response.Map(response => response.StatusCode)
Run Code Online (Sandbox Code Playgroud)

谢谢

Sti*_*gar 7

现有方法最直接的翻译是:

Task<int> statusCode = response.ContinueWith(t => t.Result.StatusCode)
Run Code Online (Sandbox Code Playgroud)

但是在实践中,你几乎总是等待任务得到结果.也许你应该研究async/await.

  • 此版本的异常处理略有不同.你们会引发一个包含实际异常的"AggrageException",John会提出实际异常. (2认同)
  • 不仅包装了异常,而且此方法还将在当前任务调度程序中运行lambda.在这种情况下它应该*工作正常,但在一般情况下,`await`比`ContinueWith`更安全. (2认同)

Jon*_*eet 5

老实说,我对此感到有些惊讶。(更可能是,我还没有看到它。)但是,您可以很容易地构建它:

public static async Task<TResult> Map<TSource, TResult>
    (Task<TSource> task, Func<TSource, TResult> selector)
    => selector(await task);
Run Code Online (Sandbox Code Playgroud)