我有一个带有XYZ()功能的主GUI线程来做一些关于GUI的事情。 在其他线程中,如果我从主GUI的句柄调用XYZ(),则显示错误 “跨线程操作无效:控制'Button00'从其创建的线程以外的线程访问。”
我该如何解决这个问题?我想我需要向GUI线程发送消息来做XYZ功能。请帮帮我。
感谢。
Ankata
答案 0 :(得分:7)
您收到此错误消息的原因是您尝试从不同于主要的线程更新GUI控件,这是不可能的。应始终在用于创建GUI控件的同一线程上修改GUI控件。
如果Invoke将编组主线程的调用,则可以使用InvokeRequired。这是一个nice article。
但最简单的解决方案可能就是简单地使用BackgroundWorker,因为这样您就不再需要手动封送对GUI线程的调用。这是自动完成的:
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
// call the XYZ function
e.Result = XYZ();
};
worker.RunWorkerCompleted += (sender, e) =>
{
// use the result of the XYZ function:
var result = e.Result;
// Here you can safely manipulate the GUI controls
};
worker.RunWorkerAsync();
答案 1 :(得分:3)
通常,C#中的GUI只能从创建它的同一个线程更新 如果它不是相同的线程,则InvokeRequired的值为true,否则为false, 如果确实如此,则再次调用相同的方法,但是从同一个线程创建GUI
你应该像这样使用它:
delegate void valueDelegate(string value);
private void SetValue(string value)
{
if (someControl.InvokeRequired)
{
someControl.Invoke(new valueDelegate(SetValue),value);
}
else
{
someControl.Text = value;
}
}
试试这个以获取更多信息