2014-12-13 2 views
-1

Что является альтернативой MethodInvoker в МОФ
В windows form я использую этот кодMethodInvoker в МОФ

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

В WPF Я использую Dispatcher.CheckAccess() вместо this.InvokeRequired но нет Dispatcher.MethodInvoke() или Dispatcher.Inovke.MethodInvoke() в МОФ
If кто-то конвертировать mycode в WPF это будет большим

Edit:

Неизвестные символы
enter image description here

+0

Смотрите здесь http://stackoverflow.com/questions/1644079/how-can-i-use-the-dispatcher- invoke-in-wpf-change-controls-from-non-main-thread и здесь http://stackoverflow.com/questions/19009174/dispatcher-invoke-vs-begininvoke-confusion – dbc

+0

Также здесь: http: // msdn. microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke%28v=vs.110%29.aspx – dbc

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

При обновлении пользовательского интерфейса из фонового потока, как правило, следует использовать BeginInvoke а не Invoke, чтобы избежать зависания ожидания потока пользовательского интерфейса для обработки запроса в то время как threa d в свою очередь ждет чего-то из фонового потока.

+0

Его работая прекрасно, добавляя данные текстового поля, но также добавляя много неизвестных знаков знака –

+0

Проверьте изображение выше –

+0

@UzairAli - Я не могу воспроизвести вашу проблему. Возможно, плохие персонажи приходят из 'readData'? Если 'readData' фактически является двоичным, тогда вы можете получить этот эффект. Вы можете увидеть содержимое 'readData' в Visual Studio или вызовом' Debug.WriteLine (readData) '. – dbc

0

Это базовый соответствующий код MethodInvoker и поток пользовательского интерфейса в WPF:

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