【问题标题】:WebClient DownloadFileAsync() does not workWebClient DownloadFileAsync() 不起作用
【发布时间】:2016-09-07 13:28:04
【问题描述】:

WebClient DownloadFileAsync() 不适用于相同的 URl 和凭据...

有什么线索吗?

 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)
            {

            }
        }

【问题讨论】:

  • 如果这确实是您程序的内容,那是因为Main 在引发事件之前就退出了。当 Main 退出时,进程终止。您要么需要按原样使用同步版本,要么阻止 Main 退出,直到引发事件。
  • 如果在 powershell 中编码,如何阻止 main 退出?

标签: c# .net webclient downloadfileasync


【解决方案1】:

您需要在异步下载完成时保持程序运行,因为它在另一个线程中运行。

尝试这样的事情,并等待它说完成,然后再按 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");
}

根据您使用的应用程序类型,主线程需要在后台线程下载文件时继续运行。

【讨论】:

  • 如何向 Completed() 发送文件名等额外信息?
  • @Simon 有什么办法可以理解下载已经完成,因为完整的功能并不完全是完整的下载
【解决方案2】:

通过将 Main 函数声明为 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);
    }
}

【讨论】:

  • 这样做有什么好处?
  • 通过使用async await,您将不必使用Console.Readline() 挂起主函数。如果你不想使用async-await,你可以像client.DownloadFileTaskAsync().Result一样调用强制等待main函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多