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
相关产品推荐
相关产品推荐

