По какой-то причине после запуска указанной ниже программы есть пауза. Я считаю, что причиной является 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 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 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);
}
}