Я пишу библиотеку для работы с хранилищем таблиц Azure.Основной шаблон заключается в том, что данный HTTP-запрос возвращает число результатов в потоке контента и указатель на следующий набор результатов в заголовках.Поскольку результаты считываются из потока, они выдаются.Я использую библиотеку System.Net.Http (ранее Microsoft.Net.Http), которая в последней версии удалила синхронную версию HttpClient.Send и другие синхронные методы.Новая версия использует Задачи.Я использовал Задачи раньше, но не для чего-то такого сложного, и мне трудно начинать.
Вызовы, которые были преобразованы в асинхронный шаблон: HttpClient.Send, response.Context.ContentReadSteam.Я очистил код, чтобы показать важные части.
var queryUri = _GetTableQueryUri(tableServiceUri, tableName, query, null, null, timeout);
while(true) {
var continuationParitionKey = "";
var continuationRowKey = "";
using (var request = GetRequest(queryUri, null, action.Method, azureAccountName, azureAccountKey))
{
using (var client = new HttpClient())
{
using (var response = client.Send(request, HttpCompletionOption.ResponseHeadersRead))
{
continuationParitionKey = // stuff from headers
continuationRowKey = // stuff from headers
using (var reader = XmlReader.Create(response.Content.ContentReadStream))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "entry" && reader.NamespaceURI == "http://www.w3.org/2005/Atom")
{
yield return XElement.ReadFrom(reader) as XElement;
}
}
reader.Close();
}
}
}
}
if (continuationParitionKey == null && continuationRowKey == null)
break;
queryUri = _GetTableQueryUri(tableServiceUri, tableName, query, continuationParitionKey, continuationRowKey, timeout);
}
Ниже приведен пример того, что я успешно конвертировал.
client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).ContinueWith(task =>
{
using (var response = task.Result)
{
if (response.StatusCode == HttpStatusCode.Created && action == HttpMethod.Post)
{
return XElement.Load(response.Content.ReadAsStreamAsync().Result);
}
}
});
У кого-нибудь есть какие-либо предложения о том, как преобразовать цикл / выход в новый шаблон?
Спасибо!Erick