2015-12-15 85 views
0

這是我第一次使用C#,我試圖創建一個進度條,每秒增加一個值(程序的一部分,它從另一個對象接收當前值並設置它到進度條)。每秒增加進度條 - 錯誤

我的簡化的對象源:

public delegate void LoadingProgressChanged(int percents); 
public event LoadingProgressChanged loadingProgressChanged; 

public void Enable() 
{ 
    loadingTimer = new Timer(1000); 
    loadingTimer.Elapsed += new ElapsedEventHandler(IncreaseLoadingPercentage); 
    loadingTimer.Start(); 
} 

private void IncreaseLoadingPercentage(object source, EventArgs e) 
{ 
    loadedPercents += getLoadingPercentsPerSecond(); 
    loadingProgressChanged(loadedPercents); 
} 

表來源:percentageChanged

的 在構造函數中

router.loadingProgressChanged += new AbstractRouter.LoadingProgressChanged(percentageChanged); 

身體

public void percentageChanged(int percs) 
{ 
    progressBar1.Value = percs; 
} 

我得到錯誤

類型的異常「System.InvalidOperationException」發生在 System.Windows.Forms.dll中但在用戶代碼中沒有處理

其他信息:跨線程操作無效:控制 「progressBar1」從訪問一個線程,而不是線程創建於 。

如果有這種異常的處理程序,程序可能會安全地繼續執行 。

我明白爲什麼會發生這種情況:在計時器線程中似乎調用了percentageChanged形式。但如何正確實施?謝謝!

+1

看看這個教程[dotnetperls(http://www.dotnetperls.com/progressbar)。它演示瞭如何更新來自'BackgroundWorker'的'ProgressBar'控件,並且該示例甚至使用'Thread.Sleep'來每隔n秒更新一次。聽起來相當接近你想要做的事,同時也可能更接近現實世界中更新和使用進度條和背景工作者的例子。 – sab669

+0

搜索右上角。搜索「從其創建的線程以外的線程訪問」 – Sorceri

+0

您應該改爲使用WinForms.Timer。 – LarsTech

回答

1

嘗試這樣的事:

public void percentageChanged(int percs) 
{ 
    Invoke(new Action(() => 
    { 
    progressBar1.Value = percs; 
    })); 
}