另一个线程中窗体的访问控制
本文关键字:访问控制 窗体 线程 另一个 | 更新日期: 2023-09-27 18:30:45
假设,我在Windows窗体上有两个按钮。当我按下 button1 时,我在一个新线程中使用一个名为 wh 的自动重置事件来等待。当我按下按钮2时,我做了wh。Set() 以便我的线程被解锁。这是我的课程来说明这一点:
public partial class Form1 : Form
{
AutoResetEvent wh = new AutoResetEvent(false);
Thread th;
public Form1()
{
InitializeComponent();
}
public void button1_Click(object sender, EventArgs e)
{
th = new Thread(thread);
th.Start();
}
public void thread()
{
MessageBox.Show("waiting..");
wh.WaitOne();
MessageBox.Show("Running..");
}
private void button2_Click(object sender, EventArgs e)
{
wh.Set();
}
}
这是按预期工作的。但我的问题是我无法从我的线程访问,比如说标签或任何其他控件。
public partial class Form1 : Form
{
AutoResetEvent wh = new AutoResetEvent(false);
public Form1()
{
InitializeComponent();
}
Thread th;
public void button1_Click(object sender, EventArgs e)
{
th = new Thread(thread);
th.Start();
}
public void thread()
{
label1.Text = "waiting..";
wh.WaitOne();
label1.Text = "running..";
}
private void button2_Click(object sender, EventArgs e)
{
wh.Set();
}
}
我在运行这个时收到一个错误,说 label1 是从另一个线程访问的。
那么我如何在第二个线程中访问控件,或修改我的代码以更改wh.WaitOne
的位置,而不会阻塞主线程?感谢代码示例!
发生这种情况是因为标签是在不同的线程上创建的,您无法直接更改它。我建议你使用BeginInvoke。
AutoResetEvent wh = new AutoResetEvent(false);
Thread th;
private delegate void SetLabelTextDelegate(string text);
public Form1()
{
InitializeComponent();
}
public void thread()
{
// Check if we need to call BeginInvoke.
if (this.InvokeRequired)
{
// Pass the same function to BeginInvoke,
this.BeginInvoke(new SetLabelTextDelegate(SetLabelText),
new object[] { "loading..." });
}
wh.WaitOne();
}
private void SetLabelText(string text)
{
label1.Text = text;
}