簡體   English   中英

從單獨的線程訪問表單的控件

[英]Accessing a form's control from a separate thread

我正在研究線程,並遇到了這個問題。 情況是這樣的:

  1. 我在單個表單上有4個進度條,一個用於下載文件,一個用於顯示頁面加載狀態等。

  2. 我必須從單獨的線程控制每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM