RestSharp DownloadData - асинхронный / ожидающий вкус - PullRequest
0 голосов
/ 29 августа 2018

Я один из тех, кто хотел бы получить в свои руки async / await версию метода DownloadData в RestSharp (http://restsharp.org) клиент, как описано в этом выпуске на Github: https://github.com/restsharp/RestSharp/issues/1028

Кто-то недавно написал, что была реализация, хотя и не идеальная для такой вещи:
https://github.com/cfHxqA/RestSharp.RestClientSyncUtil/blob/master/RestClient.Sync.Util.cs

/// <summary>
/// Executes the specified request and downloads the response data
/// </summary>
/// <param name="Client">The IRestClient this method extend</param>
/// <param name="Request">Request to be executed</param>
/// <param name="Callback">Callback function to be executed upon completion providing access to current and maximum length</param>
/// <param name="Content">Callback function to be executed upon completion providing access to received bytes</param>
public static async void DownloadDataAsync(this IRestClient Client, IRestRequest Request, Action<int, long> Callback, Action<byte[]> Content) {
  Request.Method = Method.HEAD;
  IRestResponse Response = Client.Execute(Request);

  Client.ConfigureWebRequest((s) => {
    int BytesProcessed = 0;

    System.IO.Stream RemoteStreamObject = null; ;
    System.Net.WebResponse WebResponseObject = null;

    WebResponseObject = s.GetResponse();
    if (WebResponseObject != null) {
      RemoteStreamObject = WebResponseObject.GetResponseStream();

      byte[] buffer = new byte[1024];
      int BytesRead;

      do {
        BytesRead = RemoteStreamObject.Read(buffer, 0, buffer.Length);
        BytesProcessed += BytesRead;

        if (Callback != null) Callback(BytesProcessed, Response.ContentLength);
      } while (BytesRead > 0);
    } // end statement
  });

  Request.Method = Method.GET;
  var TaskAsync = await Client.ExecuteTaskAsync(Request);
  if (Content != null) Content(TaskAsync.RawBytes);
}

Несмотря на то, что он не идеален, я попытался использовать этот бит кода и оказалось, что он выдает ошибку о потоке, выполняющем одновременно чтение и запись.

С другой стороны, я могу сделать то же самое, просто:

public static async Task<byte[]> DownloadDataAsync(this IRestClient restClient, IRestRequest restRequest, int bufferSize = 4096)
{
    var restResponse = await restClient.ExecuteTaskAsync(restRequest);
    return await Task.FromResult(restResponse.RawBytes);
}

Но не уверен, будет ли он полностью использовать асинхронные операции, мне интересно, какая из двух реализаций является лучшей для использования async / await.

...