我编写了一些C#代码来测试我打算用于工作的内部工具的实现。令我惊讶的是,它完全符合我的希望,但我不明白为什么。
private void button1_Click(object sender, EventArgs e)
{
WebClient wc = new WebClient();
wc.DownloadFile("http://url censored", @"C:\Users\Dustin\Desktop\flashplayer.exe");
bool dlComplete = System.IO.File.Exists(@"C:\Users\Dustin\Desktop\flashplayer.exe");
if (dlComplete == true)
{
System.Diagnostics.Process.Start(@"C:\Users\Dustin\Desktop\flashplayer.exe");
}
else
{
System.Windows.Forms.MessageBox.Show("Something's jacked!");
}
}
当我按下button1
时,我的机器会下载Flash安装程序然后检查文件是否存在(这是我避开事件处理程序的迂回方式,我还没有学会处理还有),并继续。
为什么我的计算机在文件下载时检查文件是否存在?当文件下载完成时,这台计算机向导如何知道如何暂停?
答案 0 :(得分:5)
WebClient.DownloadFile
是一种 同步 方法,可以下载到本地数据文件。
正如MSDN链接here上所述 - " [t]他的方法 阻止 ,同时下载资源。"
换句话说,在将控制和执行返回给线程之前,进程正在等待完成(阻塞调用函数)。
这会导致向导您在应用程序中遇到知道何时检查文件存在的情况。我知道一旦你知道诀窍就会毁掉魔法;但是,我希望情况确实如此......
答案 1 :(得分:2)
作为参考,这里有一种方式可以按照您不期望的方式工作,异步。
var webClient = new WebClient())
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync("http://www.server.com/file.txt", "C:\\file.txt");
实际上,有一整套异步C#函数。如果你对进入开发感兴趣,那么值得一读。