RestSharp:ExecuteAsync<T> 从不响应



我正在尝试使用 ExecuteAsync<T> 发出异步获取请求,但它从未响应。令我困惑的是,ExecuteAsync有效,同步方法ExecuteExecute<T>也是如此。

这是我的代码:

var restClient = new RestClient("http://localhost:44268/api/");
var request = new RestRequest("jobs/{id}", Method.GET);
request.AddUrlSegment("id", "194");
// works
var req1 = restClient.Execute(request).Content;
// works
var req2 = restClient.Execute<Job>(request).Content;
// works
var req3 = restClient.ExecuteAsync(request, (restResponse) =>
{
    var test = restResponse.Content;
    Console.WriteLine(test);
});
var req4 = restClient.ExecuteAsync<Job>(request, (restResponse) =>
{
    // this code is never reached
    var test = restResponse.Content;
    Console.WriteLine(test);
});

已成功调用 API,但从不回调。为什么?我做错了什么吗?

ExecuteAsync是异步的。

这意味着对它的调用会立即返回,而无需等待响应。

然后,您的程序将继续正常进行。如果这是一个控制台应用,并且执行在Main方法结束时,则整个程序将退出。

所以,你有一个竞争条件。大多数情况下,您的程序将在延续(lambda回调)有机会运行之前退出。

尝试在Main方法结束时进行Console.ReadLine();调用,以防止提前退出。

此问题已通过升级到最新版本的RestSharp来解决。

public  Task<IRestResponse> ExecuteAsync<T>(RestRequest request, RestClient client)
{
  EventWaitHandle executedCallBack = new AutoResetEvent(false);
  TaskCompletionSource<IRestResponse> tcs = new TaskCompletionSource<IRestResponse>();
IRestResponse res = new RestResponse();   
    try
    {
      var asyncHandle = client.ExecuteAsync<RestResponse>(request, response =>
        {
          res = response;
          tcs.TrySetResult(res);
          executedCallBack.Set();
        });

    }
    catch (Exception ex)
    {
      tcs.TrySetException(ex);
    }
    return tcs.Task;
}
IRestResponse loginResponse = new RestResponse();
                    TaskCompletionSource<IRestResponse> tcs = new TaskCompletionSource<IRestResponse>();
//Task task = new Task(() => {client.ExecuteAsync<RestResponse>(request, tcs.SetResult);});// Lambda and anonymous method  
Task task = new Task(() =>client.ExecuteAsync<RestResponse>(request, tcs.SetResult)); // Lambda and named method                    
task.Start();
loginResponse = await tcs.Task;

最新更新