2017-03-04 71 views
0

我寫了一點C#代碼來測試我打算在工作中使用的內部工具的實現。令我驚訝的是,它的功能完全如我所願,但我不明白爲什麼。.NET如何知道何時繼續下一行代碼?

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

DownloadFile被稱爲** **同步的方法,這意味着直到方法完成 – Michael

+0

你嘗試過「大」文件的程序將停止excecution? – geekzster

+0

@geekzster不,但我確實監視了我的桌面,並確定我描述的行爲是發生了什麼。我是不是該? – dpl47

回答

5

WebClient.DownloadFile同步方法,其中,下載到本地數據文件。

由於MSDN鏈接here上註明 - 「[T]他的方法在下載資源。」

換句話說,該過程正在等待完成(阻止調用函數),然後再將控制權和執行權返回給線程。

這將導致巫術你與應用程序知道什麼時候來檢查文件的存在體驗。我知道一旦你知道這個竅門,魔法就會毀了;然而,我希望這不是情況..

+0

這不是訣竅本身,毀了魔法;你發現這個技巧的速度有多快。謝謝! – dpl47

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

+0

啊哈!這是事件處理的東西,我還沒有學到,並試圖避免(僅僅因爲我還沒有了解它)。謝謝(你的)信息!我會研究。 – dpl47

+1

我可以建議從這個博客開始?這不是我的,但它教會了我很多關於異步/等待C#的內容 起初它可能會讓人感到恐懼和超級困惑,但我保證,一旦你掌握了它,你就會喜歡任務的簡單性和易用性,任務並行庫(TPL)通過線程池和原始線程。 :) http://blog.stephencleary.com/2012/02/async-and-await.html –

+1

謝謝!收藏它。 – dpl47

相關問題