无法使任务 <HttpResponseMessage> “等待”
Posted
技术标签:
【中文标题】无法使任务 <HttpResponseMessage> “等待”【英文标题】:Cannot make Task <HttpResponseMessage> "await" 【发布时间】: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
中使用)。
【参考方案1】:
据我所知,这是因为您的方法返回Task
,而不是Task<T>
。所以你不能做return await response.Content.ReadAsAsync<T>()
。更改签名返回Task<T>
:
public static async Task<T> Get<T>(...)
【讨论】:
我试过你的方法。但不幸的是没有工作..:-( @TejasSutar,既然您已将签名更改为Task<T>
,那么错误消息是什么?具体是哪一行给出的?
@TejasSutar,你的目标是 Net 4.0 吗?
这和我之前提到的一样的错误信息。还有一件事我忘了提到编译器找不到 ReadAsAsync 方法的定义。我指的是以下网站的代码:asp.net/web-api/overview/web-api-clients/…
是的。我刚刚在 VS 中使用包管理器添加了 Microsoft.Bcl.Async。现在我需要消除语句“return await response.Content.ReadAsAsync嗯...我执行了以下操作来编译它。
-
为 system.net.http.formatting 扩展 dll 添加 web api 2.2
-
将方法签名从
Task
更改为Task<T>
祝你好运!
【讨论】:
【参考方案3】:更新 Microsoft.Bcl.Build Nuget 包对我有用。
【讨论】:
以上是关于无法使任务 <HttpResponseMessage> “等待”的主要内容,如果未能解决你的问题,请参考以下文章