在C#中,如果要在一個線程中訪問窗體控件,需要使用Invoke方法。下面是一個示例代碼:
using System;
using System.Threading;
using System.Windows.Forms;
namespace CrossThreadAccess
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 創建一個新的線程
Thread thread = new Thread(new ThreadStart(ThreadMethod));
thread.Start();
}
private void ThreadMethod()
{
// 跨線程調用窗體控件
if (textBox1.InvokeRequired)
{
// 使用Invoke方法在UI線程上調用SetText方法
textBox1.Invoke(new Action(SetText), new object[] { "Hello from another thread!" });
}
else
{
SetText();
}
}
private void SetText()
{
textBox1.Text = "Hello from the UI thread!";
}
}
}
在上面的示例中,當點擊button1
時,會啟動一個新的線程,然后在該線程中調用ThreadMethod
方法。在ThreadMethod
方法中,首先判斷是否需要跨線程訪問窗體控件。如果需要,就使用Invoke方法在UI線程上調用SetText方法,否則直接調用SetText方法。SetText方法用來更新窗體上的控件。
需要注意的是,Invoke方法的使用必須在UI線程上進行調用。如果在UI線程上調用Invoke方法,將會同步執行,而在其他線程上調用Invoke方法,將會異步執行。