[英]Threadpool - How to call a method (with params) in the main thread from a worker thread
[英]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.