По какой-то причине происходит пауза после запуска программы. Я считаю, что причина WebClient().DownloadStringTaskAsync()
.
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;
}
Он работает так, как должен. Я имею в виду, что он ничего не загружает, но начинается сразу и не блокирует основной поток, выполняя свою работу.
Edit
Хорошо, теперь я верю: функция 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);
}
}