私はウィンドウのフォームでマルチスレッドを使用していました。以下は私のクラスです。 私はデザイナーのラベルコントロールを持っていて、新しく作成されたスレッドの下で、テキストプロパティを更新しています。スレッドと匿名メソッドの代理人 - 新しいスレッドのコントロールを更新する
デリゲートの "Del"に "UpdateLabel"という関数をカプセル化したケースがあります。 と正常に動作します。
public partial class DynamicType : Form
{
delegate void Del(String x);
public DynamicType()
{
InitializeComponent();
}
private void DynamicType_Load(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(StartThread));
t.Start();
}
private void StartThread()
{
this.Invoke(new Del(UpdateLabel), new object[] { "Hi" });
}
private void UpdateLabel(String str)
{
label1.Text = str;
}
}
匿名メソッドと呼ばれる別のケースがあります。以下のメソッドで匿名メソッド を実装する際に。以下はその定義です。
private void StartThread()
{
UpdateLabel("Hi");
}
private void UpdateLabel(String str)
{
Del Label = delegate(String k)
{
label1.Text = k;
};
Label("hi");
}
クロススレッド操作有効ではありません:それが作成されたスレッド以外のスレッドからアクセスコントロール「LABEL1」。
代理人を使用していた前のケースではクエリが実行されていましたが、正常に動作しました。匿名メソッドの場合は、代理人を直接インスタンス化して余分な関数を削除し、ラベルコントロールのテキストプロパティを更新しようとしました。上記のように。理由?