C#跨线程调用问题

标签 c# winforms delegates multithreading invokerequired

我正在用 C# 编写一个表单应用程序,我需要能够从任何线程更改富文本框的内容,我尝试使用 delegateInvokeRequired,但是我做的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/

相关文章:

c# - 从泛型方法返回 null

c# - 如何避免用户帐户控制或在 Win7 中始终以管理员模式运行 Windows 应用程序

iOS NSURLConnection 委托(delegate)问题

ios - Three20 的 TTNavigator 和委托(delegate)模式

iphone - 如何更改文本 "App would like to use your current location?"

c# - Reflection.Emit:在 getter/setter 中调用函数的属性

c# - 使用套接字的文件传输 (C#) - 接收到的文件不包含完整数据

C# 如何使用 OpenCV 去除验证码的噪音?

c# - 从内存流复制时显示 Windows 文件复制对话框?

c# - 代码内部包含的用户和密码