2017-08-04 5 views
3

J'ai essayé de mettre à jour certaines données sans demander aux utilisateurs sur l'application Windows, mais lorsque j'essaie de télécharger, l'application n'est pas utilisable et les contrôles ne sont pas touchables.Impossible d'utiliser l'application actuelle lors de l'utilisation de WebClient

code:

using (WebClient client = new WebClient {Encoding = System.Text.Encoding.UTF8}) 
{ 
string url = "http://domain_name.com/api/getSomeData"; 

res = client.DownloadString(url); 
} 
+2

vous devez enquêter sur '' await' et async' pour C#. – garfbradaz

+1

Vous exécutez le téléchargement sur le thread de l'interface utilisateur afin qu'il ne puisse pas répondre pendant le téléchargement. Vous devez en apprendre davantage sur le threading. – Equalsk

+0

@garfbradaz essayer de chercher à ce sujet, merci – AliMajidiFard9

Répondre

1

Cela se passe très probablement parce que vous exécutez votre code sur le thread d'interface utilisateur. Lorsque votre thread d'interface utilisateur est occupé, il ne peut pas pomper les messages de la fenêtre tels que les événements d'entrée de la souris ou du clavier. Vos options ici sont:

  1. Exécutez ce code sur un fil séparé.

  2. Utilisez des techniques asynchrones telles que WebClient.DownloadStringAsync ou DownloadStringTaskAsync.

Parmi ceux-ci, l'option 2 est la meilleure pratique.

Voir la réponse acceptée de cette fermeture question « hors sujet » pour un exemple d'utilisation correcte des deux options (si les chiffres sont inversés de ma liste ici) how to use async and await on a method that is time comsuming

+1

@hoodacicus, donnez un exemple de code pour chaque point. – garfbradaz

+1

travaillant dessus :) – AliMajidiFard9

+0

@ AliMajidiFard9 Quand vous l'obtenez il devrait souffler votre esprit :) – hoodaticus

-2

Essayez la fonction ci-dessous Si vous voulez que je peux vous l'expliquer ligne par ligne

public static string GetWebData(string url) 
    { 
    try { 
     WebRequest request = WebRequest.Create(url); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     Stream dataStream = response.GetResponseStream(); 
     StreamReader readStream = new StreamReader(dataStream); 
     dynamic data = readStream.ReadToEnd(); 
     readStream.Close(); 
     dataStream.Close(); 
     response.Close(); 
     return data; 
    } catch (Exception ex) { 
     return ""; 
    } 
} 

J'espère que cela aide

+0

Cela fait la même chose que le code de problème de l'OP! – hoodaticus