无法使任务 <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 &lt;System.Net.Http.HttpResponseMessage&gt; is not awaitable"。经过大量搜索,我无法摆脱这个错误。有什么想法我哪里出错了吗?请帮忙。

【问题讨论】:

旁注:throw exception; 将破坏调用堆栈。只需使用throw; 我尝试了using块中的代码,第一行编译通过,但是编译器没有找到ReadAsAsync&lt;T&gt;的定义。这是一种扩展方法吗? @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&lt;T&gt;。所以你不能做return await response.Content.ReadAsAsync&lt;T&gt;()。更改签名返回Task&lt;T&gt;

public static async Task<T> Get<T>(...)

【讨论】:

我试过你的方法。但不幸的是没有工作..:-( @TejasSutar,既然您已将签名更改为 Task&lt;T&gt;,那么错误消息是什么?具体是哪一行给出的? @TejasSutar,你的目标是 Net 4.0 吗? 这和我之前提到的一样的错误信息。还有一件事我忘了提到编译器找不到 ReadAsAsync 方法的定义。我指的是以下网站的代码:asp.net/web-api/overview/web-api-clients/… 是的。我刚刚在 VS 中使用包管理器添加了 Microsoft.Bcl.Async。现在我需要消除语句“return await response.Content.ReadAsAsync();”中的编译器错误感谢@Noseratio 的帮助。【参考方案2】:

嗯...我执行了以下操作来编译它。

    为 system.net.http.formatting 扩展 dll 添加 web api 2.2

    将方法签名从Task更改为Task&lt;T&gt;

祝你好运!

【讨论】:

【参考方案3】:

更新 Microsoft.Bcl.Build Nuget 包对我有用。

【讨论】:

以上是关于无法使任务 <HttpResponseMessage> “等待”的主要内容,如果未能解决你的问题,请参考以下文章

无法使 AWS ECS 服务通过服务发现进行通信

如果 exec 任务失败,如何使 ant 脚本失败

如何将图像放在后面而不使其成为背景图像?

如何使并行独立任务在 C# 中调用 WCF

如何使 MSBuild MakeDir 任务在 Azure Pipeline YAML 模板中工作?

SBT - 如何使 InputTask 依赖于一个任务并最终完成另一个