По какой-то причине после запуска программы начинается пауза. Я считаю, что причиной является WebClient().DownloadStringTaskAsync()
.Зачем нужен WebClient.DownloadStringTaskAsync()? - новый асинхронный API/синтаксис/CTP
class Program
{
static void Main(string[] args)
{
AsyncReturnTask();
for (int i = 0; i < 15; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
}
}
public static async void AsyncReturnTask()
{
var result = await DownloadAndReturnTaskStringAsync();
Console.WriteLine(result);
}
private static async Task<string> DownloadAndReturnTaskStringAsync()
{
return await new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov"));
}
}
Насколько я понимаю, моя программа должна начинать отсчет от 0 до 15 немедленно. Я делаю что-то неправильно?
У меня была та же проблема с исходным образцом загрузки Netflix (который вы получаете с CTP) - после нажатия кнопки поиска пользовательский интерфейс сначала замерзает - и через некоторое время он реагирует при загрузке следующих фильмов. И я считаю, что это не замерзло в презентации Андерса Хейльсберга на PDC 2010.
Еще одна вещь. Когда вместо
return await new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov"));
Я использую свой собственный метод:
return await ReturnOrdinaryTask();
, которая:
public static Task<string> ReturnOrdinaryTask()
{
var t = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("------------- " + i.ToString());
Thread.Sleep(100);
}
return "some text";
});
return t;
}
Он работает как положено. Я имею в виду, что он ничего не загружает, но начинается сразу и не блокирует основной поток, выполняя свою работу.
Редактировать
Хорошо, что я считаю, прямо сейчас: функция WebClient.DownloadStringTaskAsync
ввернут. Он должен работать без начального периода блокировки, например:
static void Main(string[] args)
{
WebClient cli = new WebClient();
Task.Factory.StartNew(() =>
{
cli.DownloadStringCompleted += (sender, e) => Console.WriteLine(e.Result);
cli.DownloadStringAsync(new Uri("http://www.weather.gov"));
});
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
}
}
Да, я вижу, что он работает так, как вы сказали - но я верю, что это какая-то ошибка. Идея заключается в том, что асинхронные операции, такие как DownloadStringTaskAsync(), не блокируют основной/ui/вызывающий поток - все, что принимает некоторые время должно быть запущено на другом потоке и немедленно вернуться (иначе - в чем смысл?). Поэтому возникает вопрос: я что-то делаю неправильно или метод DownloadStringTaskAsync() запутан - я знаю, что это ctp/prototype прямо сейчас. Но странно, что в ходе презентации казалось, что на компьютере Хейльсберга он работал нормально (без первоначальной блокировки). – agend
Кто-нибудь может проверить этот код на своем компьютере и подтвердить начальное поведение блокировки? TIA Arek – agend
@agend, я запускал это на своей собственной машине, и я вижу начальное поведение блокировки. – driis