Почему WebClient.DownloadStringTaskAsync () блокируется? - новый асинхронный API / синтаксис / CTP

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

15
задан Peter Mortensen 1 November 2010 в 09:43
поделиться