gpt4 book ai didi

c# - 在多线程中更新 UI 的最佳方法是什么

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:04 24 4
gpt4 key购买 nike

我有三个类,其中两个是 UI 类,在 mainForm 类中,我通过执行启动一个新表单

new LoginForm.ShowDialog();

在 LoginForm 类中,我编写了有关登录和注销的代码,当用户登录时,我启动一个新线程来检查是否需要做一些事情,并更新数据库;这是问题,我不知道如何更新 MainForm 中的标签我搜索了这个问题,他们告诉我应该使用 Delegate。但这真的让我很困惑,因为他们不在同一个类(class),所以我不知道如何使用 Delegate cross thread 和 cross different到现在为止,我的代码是这样的主窗体.cs:

public partial class MainForm : Form
public delegate void testDelegate();
public MainForm()
{
InitializeComponent();
}
public void msg(string s)
{
label.Test = s;
}
}

登录表单.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;
}

接下来我该做什么?

最佳答案

取自:Best Way to Invoke Any Cross-Threaded Code?

您还可以使用扩展方法和 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());

关于c# - 在多线程中更新 UI 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18184307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com