.NET如何知道何时继续下一行代码?

时间:2017-03-04 02:36:34

标签: c# .net

我编写了一些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安装程序然后检查文件是否存在(这是我避开事件处理程序的迂回方式,我还没有学会处理还有),并继续。

为什么我的计算机在文件下载时检查文件是否存在?当文件下载完成时,这台计算机向导如何知道如何暂停?

2 个答案:

答案 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#函数。如果你对进入开发感兴趣,那么值得一读。

https://msdn.microsoft.com/en-us/library/mt674882.aspx