2016-09-07 73 views
2

WebClient DownloadFileAsync()不能使用相同的URl和證書...WebClient DownloadFileAsync()不起作用

任何線索?

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

如果這是字面意義上的程序內容,這是因爲'Main'在事件引發之前退出。當Main退出時,該過程終止。您或者需要像現在一樣使用同步版本,或者阻止「Main」退出,直到引發事件。 – vcsjones

回答

4

在異步下載完成時需要保持程序運行,因爲它在另一個線程中運行。

嘗試這樣的事情,並等待它說完成您按下Enter鍵結束程序:

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

,取決於您所使用本什麼樣的應用程序,主線程需要保持在後臺線程下載文件時運行。

2

通過聲明主功能爲async,您還可以使用DownloadFileTaskAsyncawait

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

這有什麼好處? – Paul

+0

通過使用'async'' await',您不必通過'Console.Readline()'掛起主函數。如果你不想使用'async-await',你可以調用像'client.DownloadFileTaskAsync()。Result'來強制等待主函數。 – hellowstone