3

私には3つのクラスがあり、そのうちの2つはUIクラスで、mainFormクラスでは、実行して新しいフォームを開始します

new LoginForm.ShowDialog();

LoginForm クラスでは、ログインとログアウトに関するコードを記述します。ユーザーがログインすると、何かを行う必要があるかどうかを確認するために新しいスレッドを開始し、データベースを更新します。ここに質問があります。MainForm でこの質問を検索するラベルを更新する方法がわかりません。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

出典:クロススレッド コードを呼び出す最良の方法は?

拡張メソッドとラムダを使用して、コードをよりクリーンにすることもできます。

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 に答える