【发布时间】:2012-10-04 21:24:19
【问题描述】:
我正在尝试掌握 .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>”
非常感谢任何帮助。
【问题讨论】:
-
Task
到 T 的“自动展开”是等待任务的效果。如果您将 TestGetMethod 更改为异步,则它可以等待 GetIdList() 将 T 放入本地 var -
不相关,但惯例会推荐 GetIdListAsync() 虽然对于内部使用来说没什么大不了的,当然。 :)
-
感谢您的回复詹姆斯。我之前曾尝试过,但如果我将 GetTestMethod() 更改为使用 await,那么它也必须是异步的,所以我还需要将其类型更改为 Task
- >。然后它的调用者会和现在的 GetTestMethod() 有同样的问题?
-
好的,我想我现在明白了 - 如果我让 GetTestMethod() 无效,那么这不会发生。但是只要一个方法有返回类型,它的调用者也必须是异步的,并且在调用中使用等待等。
-
当你调用返回任务的东西时,你没有有使用等待。这实际上取决于调用者应该如何处理它。开火就忘了?安排继续吗?阻塞直到完成?还有什么?对于测试方法,假设您可以使用支持异步测试方法的测试框架,我会在异步测试方法中使用 await,但还有其他选择。
标签: c# async-await