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);