【问题标题】:'Cannot await on Task<string>' (PCL Xamarin Studio)'不能等待 Task<string>' (PCL Xamarin Studio)
【发布时间】:2014-02-26 07:16:47
【问题描述】:

我正在尝试编写以下方法:

    public async Task<string> GetJson(string url, 
                    Dictionary<string,string> parameters = null){

        // parameters?
        if (parameters != null) {
            if (parameters.Count > 0) {
                url += "?";
                foreach(var key in parameters.Keys){

                    // add parameter to url
                    url += String.Format("{0}={1}", key, parameters[key]);

                    // more parameters?
                    if(!parameters.Keys.Last ().Equals(key)){
                        url += "&";
                    }
                }
            }
        }
        // send request
        var uri = new Uri(url);
        var req = new HttpClient();
        Task<string> getJsonTask = req.GetStringAsync(uri);
        // EXCEPTION : 'Cannot await on Task<string>'
        return await getJsonTask;
    }

我在编译时遇到错误。我认为问题不在于语法。我认为是一个依赖问题。我的参考资料是:

我使用 Nuget 添加了它们。关于可能是什么问题的任何想法?

提前致谢。

更新

Selman22 建议:

    public async Task<string> GetJson(string url, Dictionary<string,string> parameters = null){
        // ...
        return await req.GetStringAsync(uri); // Same exception
    }

肯尼斯建议:

    public Task<string> GetJson(string url, Dictionary<string,string> parameters = null){
        // ...
        return req.GetStringAsync(uri); // no problems here
    }

    // Later when trying to invoke GetJson
    public async Task<List<Station>> GetStations(){
        var url = String.Format(
            "?{0}_id{1}&_render=json", 
            DublinBikeDataProvider.BASE_URL,
            DublinBikeDataProvider.STATIONS
        );
        var json = await this._httpClient.GetJson(url); // same exception
        return this.ParseStations(json);
    }

【问题讨论】:

  • 你试过return await req.GetStringAsync(uri) 吗?
  • 附带说明:在这种情况下,您不需要使用异步等待。您可以只返回一个任务,该方法将是可等待的。仅当您想在等待之后做某事时才有用。
  • 将其作为图片而非文字发布的任何具体原因?
  • Kenneth:这种情况下的行为是不一样的,因为抛出的异常不会被包装在返回的任务中。大多数人并不期望任务返回方法直接抛出。
  • 您是否安装了Microsoft.Bcl.Async?安装 NuGet 库后,您是否更改了 PCL 的目标平台?

标签: c# xamarin async-await portable-class-library


【解决方案1】:

确保您已安装 Microsoft.Bcl.Async NuGet 库。如果更改 PCL 目标平台,则应卸载所有 NuGet 包并重新安装。

【讨论】:

    【解决方案2】:

    您不能在未标记为async 的方法中等待。在这种情况下,您有两个选择...

    要么更改方法的定义,在返回类型之前包含 async 关键字:

    public async Task<string> GetJson(string url, 
                    Dictionary<string,string> parameters = null){
         // .... Your code here.
    
        return await getJsonTask;
    }
    

    或者,将方法更改为不等待:

    public Task<string> GetJson(string url, 
                    Dictionary<string,string> parameters = null){
         // .... Your code here.
    
        return getJsonTask;
    }
    

    为了可调试性和复杂性,请执行第二个 - 它会生成最少的额外代码(您并不真正需要)。如果您认为您将很快更改方法以在其中包含更多异步步骤(单个网络调用除外),您可能希望将 async 关键字保留在其中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-06
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      相关资源
      最近更新 更多