我正在尝试使用 ExecuteAsync<T>
发出异步获取请求,但它从未响应。令我困惑的是,ExecuteAsync
有效,同步方法Execute
和Execute<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;