C#跨线程调用问题
我正在用c#编写一个表单应用程序,我需要能够从任何线程更改Rich Text Box的内容,我尝试使用委托和InvokeRequired ,但我做的委托仍然给我一个跨线程调用错误,和InvokeRequired崩溃表单,而不会给出错误。 函数我需要能够从任何线程执行:
public static void updateSub(int what) { subDisplay.subBox.Text = tb[what]; }
我试图使用的代表:
public delegate void UpdateDelegateVoid(int what); static public UpdateDelegateVoid uSub = new UpdateDelegateVoid(updateSub); uSub(0);
我的InvokeRequired代码:
public static void updateSub(int what) { if (subDisplay.subBox.InvokeRequired) { subDisplay.subBox.Invoke(new MethodInvoker(finish)); } else { subDisplay.subBox.Text = tb[what]; } }
我不确定为什么上面的代码不起作用。 谢谢!
严格来说,当您检查InvokeRequired
并发现它是true
,您应该对相同方法的调用进行 InvokeRequired
。 我不确定它是否修复了您的具体问题(我需要查看更多exception详细信息和代码)但这就是我的意思:
public static void updateSub(int what) { if (subDisplay.subBox.InvokeRequired) { subDisplay.subBox.Invoke(new Action(updateSub), what); } else { subDisplay.subBox.Text = tb[what]; } }
如果您遇到“奇怪的行为”,请检查表单是否在主应用程序线程上实际创建。 在WinForms中,这不是强制的(因为它在WPF中),因此创建表单的线程实际上可能不是应用程序的根线程。
我主要使用它,它完美地工作。 出于完全相同的目的是你想要的。
public void UpdateSub(string message) { subDisplay.subBox.Invoke((Action)delegate { subDisplay.subBox.Text = message; }); }
希望它对你或其他人有帮助!
试试这个 – 如果需要调用,你可以调用相同的方法。
public void UpdateSub(string message) { if (!subDisplay.subBox.InvokeRequired) { subDisplay.subBox.Text = message; } else { var d = new UpdateFormText(UpdateSub); Invoke(d, new object[] { message }); } }
UpdateFormText是委托
public delegate void UpdateFormText(string message);