2016-09-17 19 views
0

スレッドでデータを処理すると同時に、UIでコントロールを維持したい。 私のプログラムでは、「接続」ボタンをクリックすると、クライアントはソケットを介してサーバーに接続されますが、同時にサーバーからのメッセージを継続的に待つスレッドを開始します。 私のコードは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を起動したとき、私は(私は、サーバーに送信しなければならないコマンドを収集し、テキストボックスを持っている)UIを使用することができない、ということです。 私はこの状況にどのように対処できますか?おかげさまで

答えて

-2

通常のスレッドではなくタスククラスでasync/awaitメカニズムを使用することを検討しましたか?

参考: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'はUIを直接制御するのではなく、UIを使用できません。 – jonyballerino

+0

申し訳ありません、このファイルの全コードを表示できますか? –

+0

これはうまくいきましたが、どこが間違っていたのか分かりません。どうもありがとう。 – jonyballerino

0

を使用しなければならない方法またはウィンドウの任意のコントロールを呼び出したい場合は、あなたがそれを呼び出す前に、あなたがListenThreadのために必要なすべての情報を収集し、その後(PARAM1、PARAM2 ListenThread.Startにそれを渡す必要があることを忘れないでください...)またはListenThread.Start(objectWithParameters)。

このようにすると、すべてのUIコントロールにアクセスでき、UIスレッドにアクセスできない別のスレッドからはアクセスできないUIスレッドでデータが取得されます。

ワーカースレッド(ListenThread)の計算を完了したら、Dispatcher.InvokeメソッドでUIコントロールを更新できます。 Dispatcherを呼び出すと、すべてのコントロールに完全にアクセスできるUIスレッドにコールが委任されます。

+0

'ListenThread'(' Wait')関数は、すでに持っている情報が必要です(この場合は 'socket')。私はあなたの言うことを理解していない。 – jonyballerino

関連する問題