有什么不对的异步任务的方法? [英] What's wrong with this async Task method?
问题描述
这只是一个简单的异步任务,但我一直有奇怪的编译器错误。这code从一个ASP.NET 4项目中的Web API服务,与VS2010创建的。
即使ContinueWith(非通用)隐式返回的任务,但这个错误依然存在。
块引用>code:
公共类的TestController:ApiController
{
公共任务< Htt的presponseMessage>测试()
{
字符串的URL =http://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 =http://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 ofTask<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屋!