Я недавно читал Essential C # 6.0.В главе книги, где автор объясняет многопоточность, он показывает этот метод, и я не понимаю двух вещей, которые нигде не объясняются.
private static Task WriteWebRequestSizeAsync(string url)
{
StreamReader reader = null;
WebRequest webRequest = WebRequest.Create(url);
Task task = webRequest.GetResponseAsync()
.ContinueWith(antecedent =>
{
WebResponse response = antecedent.Result;
reader = new StreamReader(response.GetResponseStream());
return reader.ReadToEndAsync();
})
.Unwrap()
.ContinueWith(antecedent =>
{
if(reader != null) reader.Dispose();
string text = antecedent.Result;
Console.WriteLine(text.Length);
});
return task;
}
1. Почему автор использует ContinueWith()
методы и называет их essential ?Как его способ сделать это лучше, чем мой подход, который не использует эти методы?
private static Task WriteWebRequestSizeAsync(string url)
{
return Task.Run(() =>
{
WebRequest webRequest = WebRequest.Create(url);
WebResponse response = webRequest.GetResponseAsync().Result;
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string text = reader.ReadToEndAsync().Result;
Console.WriteLine(text.Length);
}
});
}
2. Почему автор использует async вариантыметоды и затем получают доступ к их результату через свойство .Result
, вместо использования не асинхронных вариантов, так как в конце он, похоже, имеет тот же результат. Пожалуйста, обратите внимание, что я не изменил его в моем подходе выше