2014-12-13 57 views
-1

什么是MethodInvoker在WPF
windows form替代我使用此代码MethodInvoker在WPF

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

+0

看到这里http://stackoverflow.com/questions/1644079/how-can-i-use-the-dispatcher-调用功能于WPF的变化控制从 - 非主线程和这里http://stackoverflow.com/questions/19009174/dispatcher-invoke-vs-begininvoke-confusion – dbc 2014-12-13 19:32:41

+0

另外这里:HTTP:// MSDN。 microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke%28v=vs.110%29.aspx – dbc 2014-12-13 19:33:51

+0

我看到所有的回答的问题,但我没有找到我的情况 – 2014-12-14 07:34:20

回答

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线程处理请求的挂起的可能性, d依次等待后台线程中的某些内容。

+0

它的正确答案工作很好追加文本框数据,但也追加了很多未知的字符标志 – 2014-12-14 16:48:27

+0

检查上面的图片 – 2014-12-14 17:28:05

+0

@UzairAli - 我无法重现您的问题。也许坏字符来自'readData'?如果'readData'实际上是二进制的,那么你可以得到这个效果。你可以在Visual Studio中看到'readData'的内容或调用'Debug.WriteLine(readData)'。 – dbc 2014-12-14 18:59:42

0

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

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