You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RestSharp 106.6.10中ExecuteAsync<T>泛型异步调用参数错误解决

RestSharp同步转异步:解决ExecuteAsync参数错误问题

我来帮你搞定这个RestSharp异步改造的问题!你遇到的错误是因为RestSharp 106.6.10版本里的ExecuteAsync<T>重载要求两个参数,但更关键的是你当前的写法没有正确等待异步操作完成,导致永远拿不到接口返回的数据。咱们换个更符合async/await规范的写法来彻底解决:

错误原因解析

  • 在RestSharp 106.6.10版本中,ExecuteAsync<T>的重载签名要求你传入回调方法和**RestRequestAsyncHandle对象**两个参数,你只传了回调,所以触发了参数不匹配的错误。
  • 另外,你当前的代码逻辑里,异步请求还没执行完成就直接return了默认的result,这会导致调用方拿到永远是默认值,根本获取不到接口返回的真实数据。

最优修改方案

RestSharp 106.6.10已经支持基于Task的异步模式,我们可以改用ExecuteTaskAsync<T>方法,它直接返回Task<IRestResponse<T>>,完美适配async/await语法,不需要繁琐的回调,代码更简洁易维护。

修改后的完整GetAsync方法

public async Task<T> GetAsync<T>(string url, Dictionary<string, object> keyValuePairs = null) {
    try {
        // 检查token是否过期
        DateTime expires = DateTime.Parse(Account.Properties[".expires"]);
        if (expires < DateTime.Now) {
            // 获取新的token
            await GetRefreshTokenAsync();
        }
        // 获取AccessToken
        string token = Account.Properties["access_token"];
        if (string.IsNullOrEmpty(token))
            throw new NullReferenceException("AccessToken is null or empty!");
        // 创建客户端
        var client = new RestClient() { Timeout = 3000000 };
        // 创建请求
        var request = new RestRequest(url, Method.GET);
        request.RequestFormat = DataFormat.Json;
        request.AddHeader("Authorization", "Bearer " + token);
        // 添加请求参数(如果有)
        if (keyValuePairs != null) {
            foreach (var pair in keyValuePairs) {
                request.AddParameter(pair.Key, pair.Value);
            }
        }
        // 异步调用接口并等待结果
        var response = await client.ExecuteTaskAsync<T>(request);
        // 检查请求状态
        if (response.ResponseStatus == ResponseStatus.Completed) {
            return response.Data;
        } else {
            throw new Exception($"Call stopped with Status: {response.StatusCode} Description: {response.StatusDescription}");
        }
    } catch (Exception ex) {
        Crashes.TrackError(ex);
        return default(T);
    }
}

调用示例无需修改

你原来的调用代码已经正确使用了await,完全适配修改后的方法,不需要做任何调整:

public async Task<List<UcAudit>> GetAuditByHierarchyID(int hierarchyID) {
    string url = AuthSettings.ApiUrl + "/ApiMethod/" + hierarchyID;
    List<UcAudit> auditList = await GetAsync<List<UcAudit>>(url);
    return auditList;
}

内容的提问来源于stack exchange,提问作者TosT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:15:02