我正在尝试在.NET 4.5中掌握异步方法语法。我以为我已经完全理解了这些例子,但无论异步方法的类型是什么(即Task<T>
),我总是在转换回T
时得到相同类型的错误错误 - 我理解是非常自动的。以下代码生成错误:
无法将类型“
System.Threading.Tasks.Task<System.Collections.Generic.List<int>>
”隐式转换为“System.Collections.Generic.List<int>
”
public List<int> TestGetMethod()
{
return GetIdList(); // compiler error on this line
}
async Task<List<int>> GetIdList()
{
using (HttpClient proxy = new HttpClient())
{
string response = await proxy.GetStringAsync("www.test.com");
List<int> idList = JsonConvert.DeserializeObject<List<int>>();
return idList;
}
}
如果我也显式地转换结果,它也会失败。这样:
public List<int> TestGetMethod()
{
return (List<int>)GetIdList(); // compiler error on this line
}
在某种程度上可以预见会导致此错误:
无法将类型“
System.Threading.Tasks.Task<System.Collections.Generic.List<int>>
”转换为“System.Collections.Generic.List<int>
”
非常感谢任何帮助。
答案 0 :(得分:80)
您的示例的主要问题是您无法将Task<T>
返回类型隐式转换为基本T
类型。您需要使用Task.Result属性。请注意,Task.Result将阻止异步代码,应谨慎使用。
请改为尝试:
public List<int> TestGetMethod()
{
return GetIdList().Result;
}
答案 1 :(得分:28)
你也需要创建TestGetMethod async
并在GetIdList();
前面附加await会将任务解包到List<int>
,所以如果你的帮助函数正在返回任务,请确保你等待你也在调用函数async
。
public Task<List<int>> TestGetMethod()
{
return GetIdList();
}
async Task<List<int>> GetIdList()
{
using (HttpClient proxy = new HttpClient())
{
string response = await proxy.GetStringAsync("www.test.com");
List<int> idList = JsonConvert.DeserializeObject<List<int>>();
return idList;
}
}
另一个选项
public async void TestGetMethod(List<int> results)
{
results = await GetIdList(); // await will unwrap the List<int>
}
答案 2 :(得分:3)
根据您尝试做的事情,您可以使用GetIdList()进行阻止。结果(通常是一个坏主意,但很难说出上下文)或使用支持异步测试方法的测试框架并拥有测试方法do var results = await GetIdList();