如何在创建控件的线程之外的线程中访问控件,避免跨线程错误?
以下是我的示例代码:
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(foo);
t.Start();
}
private void foo()
{
this.Text = "Test";
}
如何在创建控件的线程之外的线程中访问控件,避免跨线程错误?
以下是我的示例代码:
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(foo);
t.Start();
}
private void foo()
{
this.Text = "Test";
}
这是一个众所周知的小模式,它看起来像这样:
public void SetText(string text)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(SetText), text);
}
else
{
this.Text = text;
}
}
还有一种快速而不太可靠的解决方法,我建议只在测试时使用。
Form.CheckForIllegalCrossThreadCalls = false;
Form.CheckForIllegalCrossThreadCalls = false;
- 这正是我所需要的。我只需要从后台线程设置一些计数器。这些计数器对逻辑并不重要,只是为了在屏幕上显示。我不关心竞争条件...谢谢! - vt100您应该使用InvokeRequired方法来检查您是否在同一线程或不同线程上。
MSDN参考:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx
您的方法可以这样重构
private void foo() {
if (this.InvokeRequired)
this.Invoke(new MethodInvoker(this.foo));
else
this.Text = "Test";
}
检查 - 如何:使 Windows Forms 控件调用线程安全
private void foo()
{
if (this.InvokeRequired)
{
this.Invoke(() => this.Text = text);
}
else
{
this.Text = text;
}
}