3

を使用して非同期getリクエストを作成しようとしています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を正常に呼び出していますが、コールバックすることはありません。なんで?私は何か間違ったことをしていますか?

4

4 に答える 4

2

ExecuteAsync非同期です。

つまり、それへの呼び出しは、応答を待たずにすぐに戻ります。

その後、プログラムは通常どおり続行されます。これがコンソールアプリであり、実行がMainメソッドの最後に来ると、プログラム全体が終了します。

つまり、競合状態があります。ほとんどの場合、プログラムは継続(ラムダコールバック)が実行される前に終了します。

早期終了を防ぐためConsole.ReadLine();に、メソッドの最後に呼び出しを入れてみてください。Main

于 2012-05-03T18:58:24.830 に答える
2

これは、RestSharpの最新バージョンにアップグレードすることで解決されました。

于 2012-06-26T14:26:04.093 に答える
0
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;
}
于 2014-11-20T11:41:14.397 に答える
0
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;
于 2014-11-21T05:41:44.447 に答える