2015-10-14 76 views
0

這是我一天的代碼。問題是進度條在1秒內變爲0到30%。VS進度條,100%做什麼

private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     progressBar1.Value = 5; 

     System.Diagnostics.Process.Start("c:/installer.exe").WaitForExit(); 
     progressBar1.Value = 10; 


     System.Diagnostics.Process.Start("c:/installer2.exe"); 
    progressBar1.Value = 30; 

} 
    } 

我想progressbar1後添加一個 「睡眠」 O 「等待」(的)

詩篇。我只想清除一件事,在Visual Studio中編碼的IAM級別爲0。我昨天開始這樣做。

+2

這是C#代碼。你確定你正在編寫C++/CLI嗎? – nvoigt

回答

2

幾年前,您必須創建一個BackgroundWorker對象來完成這項工作,以保持UI的響應。

由於幾年來我們有異步的等待可以完成這項工作。異步等待函數看起來像同步代碼,但每當看到等待時,代碼就會停止,直到它正在等待的任務完成。與此同時,等待的線程有時間做其他事情,比如更新進度條或保持UI響應。一旦線程正在等待的任務完成後,線程會在等待之後繼續執行語句。

要使用async-await,唯一要做的就是聲明事件處理程序異步。完成之後,您可以調用其他異步函數並等待其結果。

開始進程後,您可以等待Task.Delay(TimeSpan)。在這個方法中,主線程沒有做任何事情,所以有時間去做其他UI的東西。延遲完成後,它可以更新進度條並查看過程是否完成。

using System.Diagnostics; 
private async void pictureBox1_Click(object sender, EventArgs e) 
{ 
    // start the progress, don't wait until finished yet: 
    var process1 = Process.Start("c:/installer.exe").WaitForExit(); 
    while (!process1.HasExited) 
    { 
     // process not finished yet, increase progress bar and wait a while 
     this.progressBar1.Step(); 
     await Task.Delay(TimeSpan.FromSeconds(0.2); 
    } 

    // if here, process1 has finished: we are halfway: 
    progressBar1.Value = (progressbar1.Minimum + progressBar1.Maximum)/2; 

    // start process 2 
    var process2 = Process.Start("c:/installer2.exe"); 
    while (!process2.HasExited) 
    { 
     // process not finished yet, increase progress bar and wait a while 
     this.progressBar1.Step(); 
     await Task.Delay(TimeSpan.FromSeconds(0.2); 
    } 
    // both processes finished; full progressbar: 
    this.progressBar1.Value = this.progressBar1.Maximum; 
} 

當然,您可能會遇到安裝需要很長時間的問題。如果值變得太高,請考慮不再更新進度條

var halfWay = (progressbar1.Minimum + progressBar1.Maximum)/2; 
while (!process1.HasExited) 
{ 
    if (this.progressBar1.Value < halfWay) 
     this.progressBar1.Step(); 
    ... 
} 

請注意,異步等待由一個線程完成。它不是多任務處理。 Eric Lippert在計算器上有一個很好的比喻: async/await - Is this understanding correct?

假設你必須做早餐。吐司麪包,煮一些雞蛋。

  • 同步:開始烘烤麪包。等到烘烤完成。開始煮雞蛋,等到雞蛋煮熟。
  • 異步但不併發:開始烤麪包,而麪包烘烤開始煮雞蛋。當雞蛋烹飪時,你可以做其他事情,比如做茶。過了一段時間後,等到雞蛋煮熟後,等待麪包烘烤。這通常是異步等待。
  • 異步併發:僱用一名廚師烤麪包,僱傭一名廚師煮雞蛋,等到兩名廚師完成。這裏的烘烤和烹飪是由不同的線程完成的。這是最昂貴的方法
+0

我得到錯誤的「步」部分。無法使用的成員'progressbar.setp'不能像方法 –

+0

那樣使用,你查看System.Windows.Forms.ProgressBar的MSDN定義多少秒?我明顯犯了一個錯誤,因爲我必須用心打印所有內容。 MSDN說:步驟是「每次調用PerformStep方法時增加進度條的量」。我認爲這足以讓你糾正代碼。或使用:值+ = 1; –

1

使用代碼

System.Threading.Thread.Sleep(5000); 

這將保持當前線程,持續5秒。

但是:這不會改變你目前的問題。

如果我是你,我會考慮backgroundworker。這有點棘手,但它可以幫助你。您的當前線程得到更新,而後臺工作線程可以停止。那麼你會收到一個很好的表單,其中的值得到更新。在當前線程中也不鼓勵使用睡眠功能。

+0

請注意,BackgroundWorkers是由任務取代,這是更容易處理。 –

+0

考慮到這一點:-) @RoyT。 – Schuere