2013-04-13 8 views
3

récemment expérimenté avec async et attendre l'utilisation de C#. Ceci est mon codeCombien coûte C# Async et attendre

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(); 
} 

et cela l'im sortie obtenir dans TextBox1.Text

Downloading string async 5698 
Downloaded 666 

cela signifie que l'appel de la DownloadStringTaskAsync() prend autour 5.6 Seconds pour exécuter où que le téléchargement réel prend <1 second. Lorsque la raison de cette méthode est d'utiliser est de sauvegarder les ressources Thread.

Si cela est vrai, existe-t-il un cas où cette méthode de classe WebClient devrait être utilisée? Ou im juste penser en termes totalement incorrects?

+0

Hm, mesurer une seule fois peut entraîner des chiffres trompeurs – Patrick

+0

@Patrick je voulais utiliser plus tard dans mon application web dans laquelle le contrôleur est créé à chaque fois –

+2

Ce n'est pas seulement le temps de télécharger les données, mais aussi le temps dans la résolution du DNS et le temps requis pour le premier téléchargement. Je suggère que vous devriez essayer de faire un autre appel. Cela donnera un résultat différent car cette fois-ci, le DNS est déjà résolu et mis en cache et la page est également mise en cache. –

Répondre

3

Je reçois environ 300 ms la première fois, 0 msec à chaque fois par la suite. À propos de ce que je m'attendrais. Il y a toujours un peu de frais généraux lorsque vous utilisez le code pour la première fois. Au minimum, vous mesurez le coût d'obtention du code System.Net chargé dans votre programme et initialisé. WebClient semble avoir un peu de surcharge, par exemple, voir une exception se faire attraper et gérer quand il regarde dans le registre pour un proxy web. Ce qui doit être fait avant que quelque chose puisse être fait de manière asynchrone.

Encore, 5,7 secondes est une très longue période. Vous devriez regarder des choses environnementales, d'autres parties de votre machine qui veulent s'impliquer quand vous faites quelque chose d'internetty. Comme ce proxy Web, il peut être configuré pour la configuration automatique et cela prend du temps. Ou encore, votre logiciel anti-malware ou votre pare-feu se passionne pour votre utilisation d'une adresse IP sortante. Etcetera, beaucoup de parties mobiles impliquées dans le réseautage et ce n'est jamais pareil.

+0

+1. .NET effectue toujours une autodétection de proxy synchrone (qui peut inclure une requête DNS, télécharger un script proxy, générer un AppDomain pour compiler le JavaScript en IL, et l'exécuter) ainsi que (je pense) une recherche DNS. Donc, si vous avez des problèmes de proxy/DNS, les méthodes HTTP "asynchrones" ne sont soudainement pas si asynchrones. :( –

2

Vous mesurez le temps d'installation. Sur ma machine (et connexion Internet), le premier appel produit:

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

Alors que les appels suivants produisent régulièrement:

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

c'est ce que j'ai rencontré après plusieurs essais, mais quel est exactement le temps de configuration? –

0

Comme d'autres l'ont dit, vous mesurez les coûts d'installation unique, mais comme une alternative à «l'exécuter plus d'une fois», vous pouvez simplement «réchauffer» le client Web particulier.

Par exemple, entre ces 2 lignes, ajoutez un (synchrone) Télécharger * appelez

var client = new WebClient(); 

var sw = Stopwatch.StartNew(); 

Peut-être quelque chose comme ceci:

var client = new WebClient(); 

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

var sw = Stopwatch.StartNew(); 

Ensuite, votre mesure initiale ne comprend pas le client Web initial installation, et même votre première exécution devrait avoir des minutages précis (et devrait mieux correspondre faire le même appel plusieurs fois, en supposant que les résultats HTTP 200 chaque fois, et non servi hors du cache local ou 304)

Questions connexes