【问题标题】:C# wpf dispatcher confusionC# wpf 调度程序混淆
【发布时间】:2014-07-06 22:59:38
【问题描述】:

我应该如何将此代码移植到 wpf?

public void ChangeTextBox(string txt)
    {
        if (textBox1.InvokeRequired)
        {
            Invoke(new UpdateText(ChangeTextBox), new object[] { txt });
        }
        else
        {
            textBox1.Text += txt + "\r\n";
        }
    }

【问题讨论】:

  • 欢迎来到 SO。格式化、拼写和大写。

标签: c# wpf dispatcher invokerequired


【解决方案1】:

你应该可以做这样的事情:

public void ChangeTextBox(string txt)
    {
        if (!textBox1.Dispatcher.CheckAccess())
        {
            textBox1.Dispatcher.Invoke(new UpdateText(ChangeTextBox), new object[] { txt });
        }
        else
        {
            textBox1.Text += txt + "\r\n";
        }
    }

此答案基于SO questionMSDN Documentation for Dispatcher

【讨论】:

    【解决方案2】:

    您可以简单地使用控件的Dispatcher 类或应用程序级别Dispatcher,但在您的情况下,您需要控件的调度程序。另外,请注意,我不必递归调用调用方法来调用它。我可以简单地将textBox.Text 设置为您想要的值。

    发生的情况是它在幕后执行Context switch,因此允许修改您的控件,因为它正在被分派给自己的调度程序。

    if(!textBox1.Dispatcher.CheckAccess())
    {
     textbox1.Dispatcher.Invoke(new Action(() => textBox.Text += txt + "\r\n";);
    }
    else
    {
     textBox.Text += txt + "\r\n";
    }
    

    【讨论】:

    • 您需要在与 textBox1 相关的 Dispatcher 上调用 CheckAccess...而不是在文本框本身上调用 CheckAccess ;)
    • @YoupTube 抱歉,我是当场输入的。已更正。谢谢
    • @III,@YoupTube - textBox1.CheckAccess() 也可以工作,因为 textBox 派生自 DispatcherObject 其中定义了 CheckAccess() 方法。
    • @RohitVats 是的。这就是您刚醒来并直接前往 SO 时发生的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    相关资源
    最近更新 更多