方法1-控件對象.Invoke(Action<>,參數),同步執行卡UIInvoke 是同步的,它會阻塞調用線程,直到目標線程(創建控件的線程)完成所請求的操作。這意味著調用 Invoke 后,當前線程會等待,直到 UI 線程執行完指定的方法。
方法2-控件對象.BeginInvoke(Action<>,參數),異步執行不卡UI
BeginInvoke 是異步的,它會將操作放入 UI 線程的消息隊列中,然后立即返回,不會阻塞調用線程。這使得調用線程可以繼續執行其他操作,而無需等待 UI 更新完成。
方法3-Invoke((MethodInvoker)delegate
MethodInvoker 是一個無參數、無返回值的委托類型,用于表示可以被調用的方法在多線程編程中,特別是在 Windows 窗體應用程序中,MethodInvoker 常用于安全地更新 UI 控件,它可以被用作給 Invoke 和 BeginInvoke 方法傳遞的委托。
?
namespace _018_跨線程訪問控件方法
{
public partial class 跨線程訪問控件方法 : Form
{
public 跨線程訪問控件方法()
{
InitializeComponent();
}
private void bt1_Click(object sender, EventArgs e)
{
Task t1 = Task.Run(() =>
{
for (int i = 1; i < 100; i++)
{
Thread.Sleep(500);
if (this.txtBox1.InvokeRequired)
{
this.txtBox1.Invoke(new Action<string>((st) =>
{
this.txtBox1.Text = st;
}), i.ToString());
}
}
});
}
private void bt2_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
for(int i = 1;i < 100; i++)
{
Thread.Sleep(1000);
if (this.txtBox2.InvokeRequired)
{
this.txtBox2.BeginInvoke(new Action<string>((st) =>
{
this.txtBox2.Text += st+"、";
}),i.ToString());
}
}
});
}
private void bt3_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(1000);
if (this.txtBox3.InvokeRequired|| this.txtBox3.InvokeRequired)
{
Invoke((MethodInvoker)delegate
{
this.txtBox3.Text = i.ToString();
this.txtBox4.Text = i.ToString();
});
}
}
});
}
}
}
該文章在 2025/4/30 14:56:47 編輯過