[英]What is the best way to update UI in multiThread
我有三個類,其中兩個是UI類,在mainForm類中,我通過執行開始一個新表單
new LoginForm.ShowDialog();
在LoginForm類中,我編寫了有關登錄和注銷的代碼,當用戶登錄時,我啟動了一個新線程來檢查是否需要執行某些操作,並更新數據庫; 這是一個問題,我不知道如何更新標簽,因為我在MainForm中搜索了這個問題,他們告訴我應該使用Delegate。但這確實讓我感到困惑,因為他們不在同一個班級所以我不知道如何使用Delegate交叉線程和不同的交叉方法到目前為止,我的代碼就像這樣的MainForm.cs:
public partial class MainForm : Form
public delegate void testDelegate();
public MainForm()
{
InitializeComponent();
}
public void msg(string s)
{
label.Test = s;
}
}
LoginForm.cs:
JobDoer jD = new JobDoer();
Thread t2 = new Thread(new ThreadStart(jD.run));
t2.Start();
求職者:
public void run()
{
//tD();
tD = new MainForm.testDelegate(MainForm.msg);
//this.
Thread.Sleep(1000);
return;
}
接下來我該怎么辦?
摘自: 調用任何跨線程代碼的最佳方法?
您還可以使用擴展方法和lambda來使代碼更簡潔。
using System.ComponentModel;
public static class ISynchronizeInvokeExtensions
{
public static void InvokeEx<T>(this T @this, Action<T> action) where T : ISynchronizeInvoke
{
if (@this.InvokeRequired)
{
@this.Invoke(action, new object[] { @this });
}
else
{
action(@this);
}
}
}
因此,現在您可以在任何ISynchronizeInvoke上使用InvokeEx
,並能夠訪問實現類的屬性和字段。
this.InvokeEx(f => f.listView1.Items.Clear());
對於這種事情,
System.ComponentModel.BackgroundWorker類。 https://docs.microsoft.com/zh-cn/dotnet/framework/winforms/controls/how-to-implement-a-form-that-uses-a-background-operation 。 它為您處理線程同步,並具有有用的進度更新事件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.