Cómo usar RestSharp con async / await

103

Estoy luchando por encontrar un ejemplo moderno de código C # asincrónico que use RestSharp con asyncy await. Sé que Haack ha realizado una actualización reciente, pero no sé cómo utilizar los nuevos métodos.

Además, ¿cómo puedo proporcionar un token de cancelación para que la operación pueda cancelarse (por ejemplo, si una persona está harta de esperar y presiona el botón Cancelar en la interfaz de usuario de la aplicación)?

Pure.Krome
fuente

Respuestas:

202

Bueno, la actualización a la que se refiere Haack la hice yo :) Así que déjame mostrarte cómo usarla, ya que en realidad es muy simple. Anteriormente, tenía métodos como ExecuteAsyncGetese que devolverían un tipo personalizado RestSharp llamado RestRequestAsyncHandle. Este tipo no se pudo esperar ya que async/awaitfunciona Tasky Task<T>devuelve tipos. Mi solicitud de extracción agregó sobrecargas a los métodos asíncronos existentes que devuelven Task<T>instancias. Estas Task<T>sobrecargas tienen una cadena "Tarea" agregada a sus nombres, por ejemplo, se llama a la Task<T>sobrecarga . Para cada una de las nuevas sobrecargas, hay un método que no requiere que se especifique un y hay uno que sí.ExecuteAsyncGetExecuteGetTaskAsync<T>Task<T>CancellationToken

Así que ahora veamos un ejemplo real sobre cómo usarlo, que también mostrará cómo usar un CancellationToken:

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    var cancellationTokenSource = new CancellationTokenSource();

    var restResponse = 
        await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);

    // Will output the HTML contents of the requested page
    Console.WriteLine(restResponse.Content); 
}

Esto usará la ExecuteTaskAsyncsobrecarga que devuelve una Task<IRestResponse>instancia. Como devuelve un Task, puede usar la awaitpalabra clave en este método y obtener el Task<T>tipo devuelto (en este caso IRestResponse).

Puede encontrar el código aquí: http://dotnetfiddle.net/tDtKbL

Erik Schierboom
fuente
¡AH! Creo que yo: corazon: tu !! (Y muy apto, considerando que es el día de San Valentín). Sería MUY bueno agregarlo a la wiki de RestSharp. Ok, entonces ... ¿hay alguna posibilidad de que haya un PCL de esto también? ¿O estoy empujando mi suerte?
Pure.Krome
No estoy seguro de si una versión PCL de esto funcionaría, pero lo investigaré en el futuro. Y estoy de acuerdo en que sería bueno agregarlo a la wiki, no sé si puedo editarlo (no soy un mantenedor habitual de la biblioteca).
Erik Schierboom
Tal vez podamos conseguir @Haacked en la conversación, ¿tal vez en Twitter?
Pure.Krome
3
¿Cómo puedo asignar mi implementación personalizada de IRestResponse?
jpgrassi
2
Debido a que utilicé Restsharp por última vez al mismo tiempo que las hombreras estaban de moda, los teléfonos rotativos eran la norma y a todos nos encantó conectar nuestro BBS favorito a través de nuestro módem Robotics 14.4k. Señal verde de aprobación de respuesta, lo haré.
Pure.Krome
3

En mi caso, tuve que llamar a Task.Wait () para que funcione correctamente. Sin embargo, utilicé la versión que no toma CancellationTokenSource como parámetro.

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    Task<IRestResponse> t = client.ExecuteTaskAsync(request);
    t.Wait();
    var restResponse = await t;
    Console.WriteLine(restResponse.Content); // Will output the HTML contents of the requested page
}
Ram Jayaraman
fuente
9
Al usar, Waitno está aprovechando el código asincrónico, solo lo está ejecutando sincrónicamente.
The Muffin Man
En mi caso, llamar a ExecuteTaskAsynk (con o sin el token de cancelación) no regresa y hace que IIS no responda. Tuve que usar este HACK hasta encontrar la causa.
Alex 75
Si espera, ¿por qué no usa la versión sincronizada de la llamada? ... inútil
Egli Becerra
1
Sin embargo, ¿no estás liberando el hilo para usarlo en otro lugar? En una operación de larga duración en el otro extremo, eso es beneficioso, ¿no?
benmccallum
sí, llegó la salida, si la respuesta es válida, ¿estoy logrando la operación Async?
Prince Antony G