簡體   English   中英

C#Windows窗體-有關跨線程事件的問題

[英]C# windows forms - question about cross thread events

假設我創建了一個名為myClass的類,並且該類具有名為myValue的任何類型的屬性,沒關系,例如:

class myClass
{
   public delegate void OverTheLimitDlg(int arg);
   public event OverTheLimitDlg OverTheLimit;
   public myClass()
   {
       myValue = 0;
   }
   private int myvalue = 0;
   public int myValue 
   {
      get { return myvalue;}
      set 
      {
         myValue = value;
         if(value > 5)
            OvertheLimit(value);
      }
    }
}

我在窗體上有一個名為myLabel的winforms標簽,並在Form Load事件中創建了一個名為myClass的對象,訂閱了其OverTheLimit事件並啟動backgroundworker:

myClass myObj; 

private void Form_Load(object sender, EventArgs e)
{
   myObj = new myClass();
   myObj.OverTheLimit += SubsMethod;
   backgroundworker.RunWorkerAsync();
}

private void backgroundworker_DoWork(...)
{
   myObj.myValue = 10;
   //Some expressions.
}

private void SubsMethod(int someInt)
{
   myLabel.Text = "Oh it's over the limit!";
}

摘要:我創建了一個類,從該類實例化的對象可以引發事件。 我使對象在線程中觸發事件,並且它運行影響GUI對象的方法,該對象創建並在另一個線程中運行。 我從來沒有嘗試過。 在這種情況下會發生什么? 它會導致錯誤嗎? 謝謝。

在這種情況下會發生什么?

myLabel.Text = "Oh it's over the limit!";

嘗試從BackgroundWorker線程編輯myLabel時,此行將引發InvalidOperationException WinForms控件必須從創建它們的線程中更改,這就是存在Control.InvokeRequired原因。

您可以使用SubsMethod()的以下修改版本,該版本將檢查事件處理程序是否在另一個線程上運行,然后在必要時在GUI線程上調用標簽更改。

private void SubsMethod(int someInt)
{
    if (myLabel.InvokeRequired) {
        myLabel.Invoke(new MethodInvoker(()=>SubsMethod(someInt)));
        return;
    }
    myLabel.Text = "Oh it's over the limit!";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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