2015-01-05 2 views
1

Просто для академических целей, im приспосабливая предыдущий код из формы Windows к WPF, дело в том, что я не могу понять, как работает invoke, надеюсь, кто-то может пролить свет, пока я читаю некоторые учебники и объясните мне, что я мог бы сделать, адаптируя этот код.Обновление WPF TextBlock

Каждый раз, когда кто-то отправляет сообщение на send_click, он отправляет сервер, на который отправляются все подключенные сокеты. Мой вопрос: как мне адаптировать этот код, чтобы сделать текстовый блок «обновляемым»? В нем говорится, что он уже используется другим потоком (основной нить). Это код, который содержит мое приложение. Заранее спасибо!

Обновление № 1: Это моя первая попытка использования диспетчера invoke http://gyazo.com/42008aacbec2f8494bb7c6c33889d9ad, однако я не понимаю причину этого walloftext.

public Lobby() 
    { 
     InitializeComponent(); 
     ctThread = new Thread(getMessage); 
     ctThread.Start(); 
     clientSocket.Connect("127.0.0.1", 8888); 
     serverStream = clientSocket.GetStream(); 
    } 

    TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
    NetworkStream serverStream = default(NetworkStream); 
    string readData = null; 
    Thread ctThread; 


    private void btnSend_Click(object sender, RoutedEventArgs e) 
    { 
     byte[] outStream = System.Text.Encoding.ASCII.GetBytes(txtInput.Text); 
     serverStream.Write(outStream, 0, outStream.Length); 
     serverStream.Flush(); 
    } 

    private void getMessage() 
    { 
     while (true) 
     { 
      serverStream = clientSocket.GetStream(); 
      int buffSize = 0; 
      byte[] inStream = new byte[10025]; 
      buffSize = clientSocket.ReceiveBufferSize; 
      serverStream.Read(inStream, 0, buffSize); 
      string returndata = System.Text.Encoding.ASCII.GetString(inStream); 
      readData = "" + returndata; 
      Dispatcher.BeginInvoke(new Action(() => 
       { 
         txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData; 
       })); 
     } 
    }   

ответ

1

msg на своем собственном потоке, так UI обновления от этой функции должны быть ранжированы на поток пользовательского интерфейса. Вы можете использовать Dispatcher.BeginInvoke сделать это:

Dispatcher.BeginInvoke(new Action(() => 
{ 
    if (txtContent.Text != null) 
    { 
     txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData; 
    } 
}); 

Обратите внимание, что вы должны рассмотреть возможность использования привязки вместо непосредственного использования пользовательского интерфейса.

+0

По-прежнему работает мой mvvm, altho это дает мне лучший результат с этим, дело в том, что теперь после первой ошибки, которую я получаю http://gyazo.com/42008aacbec2f8494bb7c6c33889d9ad, используя перерывы, я решил, что он не отправляет больше данных на сервер, он останавливается на сервереStream, у меня есть еще 2 приложения Windows Forms для тестирования, и они хорошо связывают себя с одним и тем же кодом (кроме вызывающей части, на windowsform theres method.invoke). В любом случае, спасибо за помощь при вызове! – abr

+0

Я знаю, что случилось, неважно! Спасибо за помощь! – abr

+0

@abr Отлично! Рад, что ты заработал. – BradleyDotNET

Смежные вопросы