有什么不对的异步任务的方法? [英] What's wrong with this async Task method?

查看:397
本文介绍了有什么不对的异步任务的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这只是一个简单的异步任务,但我一直有奇怪的编译器错误。这code从一个ASP.NET 4项目中的Web API服务,与VS2010创建的。


  

即使ContinueWith(非通用)隐式返回的任务,但这个错误依然存在。


code:

 公共类的TestController:ApiController
{
       公共任务< Htt的presponseMessage>测试()
       {
            字符串的URL =htt​​p://www.stackoverflow.com;
            VAR的客户=新的HttpClient();            返回client.GetAsync(URL).ContinueWith< Htt的presponseMessage>((要求)=>
            {
                //错误361'System.Threading.Tasks.Task'不包含一个定义
                //为'结果',没有扩展方法结果接受第一个参数
                //类型'System.Threading.Tasks.Task'的可寻
                //(是否缺少using指令或程序集引用?)
                VAR响应= request.Result;
                response.EnsureSuccessStatus code();                //错误364无法隐式转换类型'System.Threading.Tasks.Task< System.Net.Http.Htt presponseMessage>'为System.Net.Http.Htt presponseMessage
                返回response.Content.ReadAsStringAsync()ContinueWith< Htt的presponseMessage>((读)= GT;
                {
                    返回新的Htt presponseMessage();
                });
            });
        }
}


解决方案

364错误是完全正常的,因为你是返回一个任务<任务< Htt的presponseMessage>> 而不是任务< Htt的presponseMessage> 。一旦你解决了361错误也将消失。

所以,你可以 展开 结果:

 公共任务< Htt的presponseMessage>测试()
{
    字符串的URL =htt​​p://www.stackoverflow.com;
    VAR的客户=新的HttpClient();
    返回client.GetAsync(URL).ContinueWith(请求= GT;
    {
        VAR响应= request.Result;
        response.EnsureSuccessStatus code();
        返回response.Content.ReadAsStringAsync()ContinueWith(T =>
        {
            VAR的结果=新的Htt presponseMessage();
            response.CreateContent(t.Result);
            返回响应;
        });
    })展开()。
}

This is just a simple async task but I have always got strange compiler errors. This code from a Web API service in a ASP.NET 4 project, created with VS2010.

Even ContinueWith (non-generic) returns Task implicitly but this error still exists.

Code:

public class TestController : ApiController
{
       public Task<HttpResponseMessage> Test()
       {
            string url = "http://www.stackoverflow.com";
            var client = new HttpClient();

            return client.GetAsync(url).ContinueWith<HttpResponseMessage>((request) =>
            {
                // Error 361 'System.Threading.Tasks.Task' does not contain a definition
                // for 'Result' and no extension method 'Result' accepting a first argument
                // of type 'System.Threading.Tasks.Task' could be found
                // (are you missing a using directive or an assembly reference?)
                var response = request.Result;
                response.EnsureSuccessStatusCode();

                // Error 364 Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>' to 'System.Net.Http.HttpResponseMessage'
                return response.Content.ReadAsStringAsync().ContinueWith<HttpResponseMessage>((read) =>
                {
                    return new HttpResponseMessage();
                });
            });
        }
}

解决方案

The 364 error is perfectly normal because you are returning a Task<Task<HttpResponseMessage>> instead of Task<HttpResponseMessage>. Once you fix that the 361 error will also disappear.

So you could Unwrap the result:

public Task<HttpResponseMessage> Test()
{
    string url = "http://www.stackoverflow.com";
    var client = new HttpClient();
    return client.GetAsync(url).ContinueWith(request =>
    {
        var response = request.Result;
        response.EnsureSuccessStatusCode();
        return response.Content.ReadAsStringAsync().ContinueWith(t =>
        {
            var result = new HttpResponseMessage();
            response.CreateContent(t.Result);
            return response;
        });
    }).Unwrap();
}

这篇关于有什么不对的异步任务的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆