我嘗試使用單獨的執行緒修改視覺控制元件。我知道如何使用委托來避免這樣的跨執行緒例外。
delegate void LabelTextDelegate(string _String);
LabelTextDelegate LabelTextDelegate1;
private void Form1_Click(object sender, EventArgs e)
{
LabelTextDelegate1 = new(LabelText);
new Thread(Method1).Start();
}
void Method1()
{
label1.Invoke(LabelTextDelegate1, "a"); // delegate
}
void LabelText(string _String)
{
label1.Text = _String;
}
但是下面的代碼更簡單也很好用。
private void Form1_Click(object sender, EventArgs e)
{
new Thread(Method1).Start();
}
void Method1()
{
label1.Invoke(LabelText, "a"); // non-delegate method
}
void LabelText(string _String)
{
label1.Text = _String;
}
有什么區別?后者正確嗎?如果是這樣,我知道 Control.Invoke 需要一個委托作為引數,它是否將非委托方法更改為內部委托?
uj5u.com熱心網友回復:
您的“非委托方法”仍在使用委托。它使用方法組轉換為委托型別(在本例中為Action<string>)。
您的代碼相當于:
void Method1()
{
label1.Invoke(new Action<string>(LabelText), "a");
}
在 C# 的早期版本中,方法組轉換不會成功,因為Delegate它不是特定的委托型別,但從 C# 10 開始,只有一個多載的方法組具有“自然型別”。
uj5u.com熱心網友回復:
沒有區別,只是第二個示例使用了 C# 2 中的語法。
實體化委托:
LabelTextDelegate myDelegate = new LabelTextDelegate(LabelText);
// C# 2 provides a sugar syntax to instantiate a delegate.
LabelTextDelegate myDelegate = LabelText;
當您將委托作為方法的引數傳遞時也是如此:
void Method1(LabelTextDelegate labelText)
{
labelText.Invoke("a");
}
Method1(new LabelTextDelegate(LabelText));
// With the C# 2 sugar syntax
Method1(LabelText);
檔案中的更多資訊: 如何宣告、實體化和使用委托
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520360.html
標籤:C#多线程代表调用
