2013-04-13 5 views
3

Недавно экспериментировал с асинхронным подключением и ожидал использования C#. Это мой кодНасколько дорого стоит C# Async и ждет

private async void button1_Click(object sender, EventArgs e) 
    { 
    textBox1.Text = string.Empty; 

    var client = new WebClient(); 

    var sw = Stopwatch.StartNew(); 

    var downloadStringTask = client.DownloadStringTaskAsync("http://www.google.com"); 

    textBox1.Text += "Downloading string async "+sw.ElapsedMilliseconds; 
    sw.Restart(); 

    await downloadStringTask; 

    textBox1.Text += Environment.NewLine + "Downloaded "+sw.ElapsedMilliseconds; 
    sw.Stop(); 
} 

и это выход им получить в TextBox1.Text

Downloading string async 5698 
Downloaded 666 

это означает только Назвав DownloadStringTaskAsync() принимает вокруг 5.6 Seconds для выполнения, где, как фактическая загрузка принимает <1 second. Когда причина, по которой этот метод должен использоваться, заключается в том, чтобы сохранить ресурсы Thread.

Если это правда, существует ли какой-либо фактический случай, когда этот метод класса WebClient должен использоваться? Или им просто думать в совершенно неправильных терминах?

+0

Hm, измерение только один раз может привести к вводящим в заблуждение цифрам – Patrick

+0

@Patrick я был готов использовать это позже в своем веб-приложении, в котором контроллер создается каждый раз –

+2

Это не просто время, затрачиваемое на загрузку данных, но и время в разрешении dns и времени, необходимого для загрузки в первый раз. Я предлагаю вам попробовать сделать еще один звонок. Это даст другой результат, так как на этот раз dns уже разрешен и кэширован, а также страница кэшируется. –

ответ

3

Я получаю около 300 мс в первый раз, 0 мсек каждый раз после этого. О том, чего я ожидаю. При первом использовании кода всегда есть куча накладных расходов. Как минимум вы измеряете стоимость получения кода System.Net, загружаемого в вашу программу, и инициализации. У WebClient также есть некоторые накладные расходы, например, я вижу, что исключение попадает и обрабатывается при просмотре реестра для веб-прокси. Основные вещи, которые необходимо выполнить, прежде чем что-то можно сделать асинхронно.

Тем не менее, 5,7 секунды - это очень долгое время. Вы должны смотреть на окружающую среду, на другие части вашей машины, которые хотят участвовать, когда вы делаете что-то интернет. Подобно этому веб-прокси, он может быть настроен на автоматическую настройку, и это требует времени. Или, как ваше антивирусное программное обеспечение или брандмауэр, взволнованный тем, что вы начинаете использовать исходящий IP-адрес. Etcetera, много движущихся частей, связанных с сетью, и это никогда не то же самое.

+0

+1. .NET всегда делает синхронное автоопределение прокси (которое может включать DNS-запрос, загрузку прокси-скрипта, разворачивание AppDomain для компиляции JavaScript в IL и его выполнение), а также (я думаю) поиск DNS. Поэтому, если у вас есть какие-либо проблемы с прокси-сервером/DNS, «асинхронные» HTTP-методы внезапно становятся не столь асинхронными. :( –

2

Вы измеряете время настройки. На моей машине (и подключение к Интернету), первый вызов производит:

Downloading string async 2636 // Varies wildly, can be up to 15s on some runs. 
Downloaded 385 

В то время как последующие вызовы последовательно производят:

Downloading string async 0 
Downloaded 289 // With small variations. 
+0

ya это то, с чем я столкнулся после нескольких попыток, но что такое SETUP TIME? –

0

Как уже говорили другие, вы измеряете затраты на установку разовых, но в качестве альтернативы «запускать его более одного раза» вы могли бы просто «разогреть» конкретного веб-клиента.

Например, между этими 2 строками, добавьте (синхронно) Скачать * называть

var client = new WebClient(); 

var sw = Stopwatch.StartNew(); 

Возможно, что-то вроде этого:

var client = new WebClient(); 

// different site, to help avoid pre-filling any caches involved 
client.DownloadData("http://www.microsoft.com/"); 

var sw = Stopwatch.StartNew(); 

Тогда ваши первоначальные измерения не будет включать в себя первоначальный веб-клиент настройки и даже ваш первый запуск должен иметь точные тайминги (и должен лучше соответствовать одному и тому же вызову несколько раз, предполагая каждый раз HTTP 200 результатов, а не обслуживаться из локального кеша или 304)

Смежные вопросы