2016-09-17 3 views
0

Я хочу обрабатывать данные в потоке и в то же время поддерживать контроль над пользовательским интерфейсом. В моей программе, когда я нажимаю кнопку «Подключиться», клиент подключается к серверу через сокет, но в то же время я бы начал поток, который постоянно ждет сообщения с сервера. Мой код approxymately:Многопоточность в приложении WPF

Thread ListenThread; 
SocketClient socket = new SocketClient(); 

     public MainWindow() 
     { 
      ListenThread = new Thread(Wait); 
      InitializeComponent(); 
      socket.StartClient(PORT); 
     } 

private void CONNECT_Click(object sender, RoutedEventArgs e) 
     { 
      socket.Connect(); 
      UpdateUI(); 
      ListenThread.Start(); 
     } 

private void Wait(){ 
      while (socket.isConnected()) 
       socket.WaitForSomething(); 
     } 

private void TextBox_KeyDown(object sender, KeyEventArgs e) 
     { 
      HandlePressure(e.Key); 
     } 

Проблема заключается в том, что, когда я начинаю ListenThread, я не могу использовать пользовательский интерфейс (у меня есть текстовое поле, который собирает команды, которые я должен отправить на сервер). Как я могу справиться с этой ситуацией? Спасибо.

ответ

-2

Рассматривали ли вы использование механизма async/await с классом Task вместо обычных потоков?

Ссылка: https://msdn.microsoft.com/en-us/library/mt674882.aspx

+0

Это не ответ. Вам нужно получить 50 очков репутации и опубликовать это как комментарий. Вы должны удалить это. – Enigmativity

2

Вы можете использовать тему.
Помните, что если вы хотите метод или какие-либо элементы управления окна называют вы должны использовать

Dispatcher.Invoke(new Action(()=> 
{ 
//Call method or controls of window here 
})); 
+0

Я уже использую класс 'Thread'. Функция 'Wait' не контролирует напрямую пользовательский интерфейс, и я не могу использовать интерфейс. – jonyballerino

+0

Извините, не могли бы вы показать мне весь код этого файла? –

+0

теперь он работает, я не знаю, где была ошибка. Большое спасибо. – jonyballerino

0

Вы должны собрать всю информацию, необходимую для ListenThread, прежде чем позвонить, а затем передать его в ListenThread.Start (param1, param2 ...) или ListenThread.Start (objectWithParameters).

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

Когда вы закончили с расчетами на рабочий поток (ListenThread), вы можете обновить элементы управления пользовательского интерфейса, используя метод Dispatcher.Invoke. Вызов делегатов диспетчера вызывает поток пользовательского интерфейса, где вы можете иметь полный доступ ко всем элементам управления.

+0

В функции, называемой 'ListenThread' (' Wait'), мне нужны данные, которые у меня уже есть (в данном случае - «socket»). Я не совсем понимаю, что вы говорите. – jonyballerino