Я один из тех, кто хотел бы получить в свои руки 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
.