[英]Accessing a form's control from a separate thread
我正在研究線程,並遇到了這個問題。 情況是這樣的:
我在單個表單上有4個進度條,一個用於下載文件,一個用於顯示頁面加載狀態等。
我必須從單獨的線程控制每個ProgressBar的進度。
問題是我收到一個InvalidOperationException ,它說
跨線程操作無效:從創建該線程的線程之外的其他線程訪問控件'progressBar1'。
我在這種方法上錯了嗎?或者有人可以告訴我如何實現嗎?
Control
只能在創建它的線程(UI線程)中訪問。
您將必須執行以下操作:
Invoke(new Action(() =>
{
progressBar1.Value = newValue;
}));
然后,invoke方法在UI線程上執行給定的委托。
您可以檢查Control.InvokeRequired標志,然后在必要時使用Control.Invoke方法。 Control.Invoke需要一個委托,因此您可以使用內置的Action <T>。
public void UpdateProgress(int percentComplete)
{
if (!InvokeRequired)
{
ProgressBar.Value = percentComplete;
}
else
{
Invoke(new Action<int>(UpdateProgress), percentComplete);
}
}
UI元素只能由UI線程訪問。 WinForms和WPF / Silverlight不允許從多個線程訪問控件。
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
}
也許這會工作。
您需要從非UI線程調用方法Invoke,以對表單和其他控件執行一些操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.