簡體   English   中英

在multiThread中更新UI的最佳方法是什么

[英]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.

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