3

我有三个类,其中两个是 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;
        }
}

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

接下来我该怎么办?

4

2 回答 2

0

摘自:调用任何跨线程代码的最佳方式?

您还可以使用扩展方法和 lambdas 来使您的代码更加简洁。

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);
    }
  }
}

所以现在您可以InvokeEx在任何 ISynchronizeInvoke 上使用,并且能够访问实现类的属性和字段。

this.InvokeEx(f => f.listView1.Items.Clear());
于 2013-08-12T11:03:07.467 回答
0

对于这种事情,有
System.ComponentModel.BackgroundWorker 类。 https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-implement-a-form-that-uses-a-background-operation。它为您处理线程同步,此外它还有一个有用的 prgress 更新事件

于 2019-01-13T06:51:11.227 回答