2013-05-18 3 views
2

J'ai besoin que la méthode Join soit appelée lorsque la méthode Download.file est terminée. Je essayé d'ajouter mot-clé mais attendent ça n'a pasComment attendre la méthode asynchrone dans un thread?

Thread myThread = new Thread(new ThreadStart(()=> await Download.file(uri))); 
Thread myThread = new Thread(new ThreadStart(()=>Download.file(uri))); 
myThread.Start(); 
myThread.Join(); 

class Download{  
    public static async void file(string url) 
    { 
     try 
     { 
      HttpWebRequest request; 
      HttpWebResponse webResponse = null; 
      request = HttpWebRequest.CreateHttp(url); 
      request.AllowReadStreamBuffering = true; 
      webResponse = await request.GetResponseAsync() as HttpWebResponse; 
      Stream responseStream = webResponse.GetResponseStream(); 
      using (StreamReader reader = new StreamReader(responseStream)) 
      { 
       string content = await reader.ReadToEndAsync(); 
      } 
      webResponse.Close(); 
     } 
     catch (Exception ex) { 
      Debug.WriteLine(ex.Message); 
     } 
    } 
} 

Merci

Répondre

5

Vous devriez faire votre méthode file (qui est mal nommé, par la voie - il devrait probablement être quelque chose comme DownloadFileAsync) Renvoie Task au lieu de void.

Ensuite, vous pouvez l'attendre.

Cependant, il n'est pas clair pourquoi vous démarrez cela dans un thread différent de toute façon - le point de l'asynchronie est que vous n'avez pas besoin de démarrer un nouveau thread. D'un autre méthode async, vous pouvez simplement utiliser:

await Download.file(uri); 

(Bien sûr, le fait que la méthode ne fait rien avec le contenu est un peu étrange ...)

Vous devriez également envisager d'utiliser HttpClient ou WebClient, qui ont tous deux ce comportement déjà disponible.

Questions connexes