【问题标题】:MethodInvoker in WpfWpf 中的方法调用程序
【发布时间】:2014-12-15 02:59:53
【问题描述】:

wpf 中 MethodInvoker 的替代方案是什么
windows form我使用这个代码

private void msg()
{
   if (this.InvokeRequired)
        this.Invoke(new MethodInvoker(msg));
   else
        textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + readData;

在 WPF 中,我使用 Dispatcher.CheckAccess() 而不是 this.InvokeRequired,但 wpf 中没有 Dispatcher.MethodInvoke()Dispatcher.Inovke.MethodInvoke()
如果有人将 mycode 转换为 WPF,那就太好了

编辑:

未知字符

【问题讨论】:

标签: c# wpf multithreading


【解决方案1】:

那么你可以使用这个:

public static class TextBoxExtensions
{
    public static void CheckAppendText(this TextBoxBase textBox, string msg, bool waitUntilReturn = false)
    {
        Action append = () => textBox.AppendText(msg);
        if (textBox.CheckAccess())
        {
            append();
        }
        else if (waitUntilReturn)
        {
            textBox.Dispatcher.Invoke(append);
        }
        else
        {
            textBox.Dispatcher.BeginInvoke(append);
        }
    }
}

然后这样称呼它

    private void msg()
    {
        textBox1.CheckAppendText(Environment.NewLine + " >> " + readData);
    }

当从后台线程更新 UI 时,您通常应该使用 BeginInvoke 而不是 Invoke 以避免等待 UI 线程处理请求而该线程依次等待来自后台线程。

【讨论】:

  • 附加文本框数据但也附加大量未知字符符号的工作正常
  • 查看上图
  • @UzairAli - 我无法重现您的问题。也许坏角色来自readData?如果readData 实际上是二进制的,那么您可以获得这种效果。您可以在 Visual Studio 中查看readData 的内容或调用Debug.WriteLine(readData)
  • 不,我在执行此方法之前检查了readData,它完全没问题我使用了此代码private void msg() { MessageBox.Show(readData); textBox1.CheckAppendText(Environment.NewLine + " >> " + readData); }
  • 哦,是的,这是我这边的问题。 MessageBox.Show(readData.Text) 正确显示了文本,但是当我使用 MessageBox.Show(readData.Text.Length) 检查该文本的长度时,它的长度非常长(10k 字)。
【解决方案2】:

这是WPF中MethodInvoker和UI线程的基本对应代码:

if (control.Dispatcher.CheckAccess())
  UpdateUI();
else
  control.Dispatcher.Invoke(new Action(UpdateUI));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多