我正在用 C# 编写一个表单应用程序,我需要能够从任何线程更改富文本框的内容,我尝试使用 delegate 和 InvokeRequired,但是我做的delegate还是给我一个跨线程调用的错误,InvokeRequired崩溃了表单,没有报错。 我需要能够从任何线程执行的功能:
public static void updateSub(int what)
{
subDisplay.subBox.Text = tb[what];
}
我尝试使用的委托(delegate):
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
时,您应该将调用编码到相同的方法。我不确定它是否解决了您的具体问题(我需要查看更多异常详细信息和代码)但这就是我的意思:
public static void updateSub(int what)
{
if (subDisplay.subBox.InvokeRequired)
{
subDisplay.subBox.Invoke(new Action<int>(updateSub), what);
}
else
{
subDisplay.subBox.Text = tb[what];
}
}
如果您遇到“奇怪的行为”,请检查该表单是否实际上是在主应用程序线程上创建的。在 WinForms 中,这不是强制的(就像在 WPF 中一样),因此创建表单的线程可能实际上不是应用程序的根线程。
关于C#跨线程调用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5815948/