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

时间:2016-07-29 13:58:32

标签: c# asynchronous

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

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

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

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

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

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

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

由于

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

我很遗憾,在框架中没有任何东西,说实话。 (更有可能的是,我还没有看到它。)你可以很容易地构建它:

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

答案 2 :(得分:0)

对于现代C#,应使用await重写:

var response = await httpClient.GetAsync("www.google.com")

var statusCode  = response.StatusCode;

这可以与async一起使用来创建Task<int>的东西:

async Task<int> Fetch(string url)
{
    var response = await httpClient.GetAsync(url);
    return response.StatusCode;
}