Wpf中的MethodInvoker

时间:2014-12-13 18:50:26

标签: c# wpf multithreading

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,那将是非常好的

修改:

未知字符
enter image description here

2 个答案:

答案 0 :(得分:0)

然后你可以用这个:

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线程处理请求的可能性,而该线程又是等待后台线程的东西。

答案 1 :(得分:0)

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

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