【发布时间】:2014-06-02 10:59:31
【问题描述】:
我正在尝试在我的 web api 包装器中编写一个方法。我想利用“async/await”功能,这样 UI 就不会被阻塞。下面是 web api 包装器中的代码 sn-p。
public static async Task Get<T>(Dictionary<string, string> paramDictionary, string controller)
{
try
{
string absoluteUrl = BaseUrl + controller + "?";
absoluteUrl = paramDictionary.Aggregate(absoluteUrl,
(current, keyValuePair) => current + (keyValuePair.Key + "=" + keyValuePair.Value + "&"));
absoluteUrl = absoluteUrl.TrimEnd('&');
using (HttpClient client = GetClient(absoluteUrl))
{
HttpResponseMessage response = await client.GetAsync(absoluteUrl);
return await response.Content.ReadAsAsync<T>();
}
}
catch (Exception exception)
{
throw exception;
}
}
问题是我在下面的语句中得到编译器错误。
HttpResponseMessage response = await client.GetAsync(absoluteUrl);
上面写着"Type System.Threading.Tasks.Task <System.Net.Http.HttpResponseMessage> is not awaitable"。经过大量搜索,我无法摆脱这个错误。有什么想法我哪里出错了吗?请帮忙。
【问题讨论】:
-
旁注:
throw exception;将破坏调用堆栈。只需使用throw; -
我尝试了using块中的代码,第一行编译通过,但是编译器没有找到
ReadAsAsync<T>的定义。这是一种扩展方法吗? -
@jgauffin 是的,除此之外,仅仅为了重新抛出异常就不需要捕获异常。只需在此处删除整个 try catch 部分...
-
您的目标是 VS2013 中的 .Net 4.0 吗? .Net 4.0 中的
Task版本没有所需的GetAwaiter方法,因此不能与async/await 一起使用。您可以使用异步定位包添加所需的方法。 -
@NedStoyanov,是的,它与
try/catch/finally和其他 C# 控制流语句相同。虽然,您不能在catch/finally中使用await(您可以在try中使用)。
标签: c# asynchronous httpclient async-await