c#跨线程调用问题

本文关键字:问题 调用 线程 | 更新日期: 2023-09-27 17:54:02

我正在c#中编写一个表单应用程序,我需要能够从任何线程更改富文本框的内容,我尝试使用委托 invokerequirequired ,但是我所做的委托仍然给我一个跨线程调用错误,并且invokerequirequired崩溃了表单,没有给出错误。我需要能够从任何线程执行的函数:

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

我的invokerrequiredcode:

    public static void updateSub(int what)
    {
        if (subDisplay.subBox.InvokeRequired)
        {
            subDisplay.subBox.Invoke(new MethodInvoker(finish));
        }
        else
        {
            subDisplay.subBox.Text = tb[what];
        }
    }

我真的不知道为什么上面的代码不工作。谢谢!

c#跨线程调用问题

严格地说,当您检查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中),所以有可能创建表单的线程实际上不是应用程序的根线程。

我主要使用这个,它工作得很好。与你的意图完全相同。

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