2016-09-07 3 views
2

WebClient DownloadFileAsync() funktioniert nicht mit der gleichen URL und Credentials ...WebClient DownloadFileAsync() funktioniert nicht

Jeder Hinweis?

static void Main(string[] args) 
     { 
      try 
      { 
       var urlAddress = "http://mywebsite.com/msexceldoc.xlsx"; 


       using (var client = new WebClient()) 
       { 
        client.Credentials = new NetworkCredential("UserName", "Password"); 
        // It works fine. 
        client.DownloadFile(urlAddress, @"D:\1.xlsx"); 
       } 

       /*using (var client = new WebClient()) 
       { 
        client.Credentials = new NetworkCredential("UserName", "Password"); 

        // It y creats file with 0 bytes. Dunow why is it. 
        client.DownloadFileAsync(new Uri(urlAddress), @"D:\1.xlsx"); 
        //client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 

       }*/ 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
+5

Wenn das buchstäblich der Inhalt Ihres Programms ist, dann ist es, weil 'Main' Verlassen wird, bevor das Ereignis ausgelöst wird. Wenn Main beendet wird, wird der Prozess beendet. Sie müssen entweder die synchrone Version wie Sie sind, oder blockieren 'Main' vom Beenden, bis das Ereignis ausgelöst wird. – vcsjones

Antwort

4

Sie müssen das Programm ausführen, während der asynchrone Download abgeschlossen ist, da es in einem anderen Thread ausgeführt wird.

Versuchen Sie so etwas wie diese, und warten, bis es fertig zu sagen, bevor Sie das Programm beenden drücken Sie die Eingabetaste zu:

static void Main(string[] args) 
    { 
     try 
     { 
      var urlAddress = "http://mywebsite.com/msexceldoc.xlsx"; 

      using (var client = new WebClient()) 
      { 
       client.Credentials = new NetworkCredential("UserName", "Password"); 

       client.DownloadFileAsync(new Uri(urlAddress), @"D:\1.xlsx"); 
       client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
     } 
     catch (Exception ex) 
     { 

     } 

    Console.ReadLine(); 
    } 

public static void Completed(object o, AsyncCompletedEventArgs args) 
{ 
    Console.WriteLine("Completed"); 
} 

Je welche Art von Anwendung, die Sie dies in verwenden, muss der Haupt-Thread halten läuft, während der Hintergrundthread die Datei herunterlädt.

2

Wenn Sie die Hauptfunktion als async deklarieren, können Sie auch DownloadFileTaskAsync mit await verwenden.

public static async void Main(string[] args) 
{ 
    var urlAddress = "http://mywebsite.com/msexceldoc.xlsx"; 
    var fileName = @"D:\1.xlsx"; 

    using (var client = new WebClient()) 
    { 
     await client.DownloadFileTaskAsync(new Uri(urlAddress), fileName); 
    } 
} 
+0

Was ist der Vorteil davon? – Paul

+0

Wenn Sie 'async'' erwarten' verwenden, müssen Sie die Hauptfunktion nicht mit 'Console.Readline()' anhalten. Wenn Sie nicht 'async-await' verwenden möchten, können Sie wie' client.DownloadFileTaskAsync(). Result' aufrufen, um das Warten auf die Hauptfunktion zu erzwingen. – hellowstone

Verwandte Themen