簡體   English   中英

從UI線程在工作線程上調用方法

[英]Call method on worker thread FROM the UI thread

我使用C#在Winforms中工作,我有一個主窗體,該主窗體在單獨的線程上創建了第二個UI窗體。

viewThread = new Thread( ( ) => 
{ 
  views = new Views.Views( displayRotators, screenLocationLeft, screenLocationTop, screenHeight, screenWidth );
  Application.Run( views );
} );
viewThread.SetApartmentState( ApartmentState.STA );
viewThread.Start( );

在第二個UI窗體上,我現在需要調用一個方法來啟動顯示循環,該循環將一直運行直到終止線程。 我花了大約三個小時的時間來嘗試找到一種方法來執行此操作,但是我能找到的只是從工作線程中調用主UI線程的方法的示例,而不是從主UI線程中調用工作線程的方法的示例。 誰能告訴我該怎么做?

謝謝。

在極少數情況下,運行多個UI線程確實有意義。 除非您有非常令人信服的理由這樣做,否則我將回到單個UI線程。

假設您必須有多個UI線程,則黃金法則是, 只能從創建控件的UI線程中更新控件。 如果您想一般地調用方法 ,則根本不需要封送它們。 但是,如果這些方法又與UI控件進行交互, 則將以與調用來自不屬於該控件的UI線程的任何其他線程完全相同的方式編組該調用。

如果你有類似的東西

btnOnForm1OnUIThread1_Click(...)
{
    UpdateForm2OnUIThread2();
}

UpdateForm2OnUIThread2()
{
    if (control.InvokeRequired)
    {
      // Syntax of this line may be slightly off as I'm writing from memory ... 
      // I normally use an extension method
      control.Invoke(UpdateForm2OnUIThread2); 
    }
    else
    {
      control.Text = "Blah";
    }    
}

一種。 如果您知道自己做了什么,那么使用多個UI線程就沒有問題。

b。 這是不正確的,並且調用UI線程工作程序會造成混亂-從開發人員的角度來看,UI線程#2與#1相同。 一旦意識到這一點,許多問題就會清除。

C。 如果要從view1 [在UI線程#1中運行]調用view2.SomeMethod()[在UI線程2中運行]-在view2上調用BeginInvoke。

下面的代碼很容易采用。 button1-啟動第二個UI線程。 button2-從UI線程2中的窗體上的UI線程1調用方法

    Form2 form;
    private void button1_Click(object sender, EventArgs e)
    {
        Thread viewThread = new Thread(() =>
        {
            form = new Form2();
            Application.Run(form);
        });
        viewThread.SetApartmentState(ApartmentState.STA);
        viewThread.Start();

        label1.Text = Thread.CurrentThread.ManagedThreadId.ToString();

    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (form != null)
        {
            form.BeginInvoke(new Action(() => 
                {form.Method("Form1 is calling...");}));
        }
    }

形式2:

    public void Method(string s)
    {
        label1.Text = string.Format("{0} '{1}'", 
                        Thread.CurrentThread.ManagedThreadId, s);
    }

您會看到線程號不同,但字符串已經越過它們了。

暫無
暫無

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

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