2017-08-27 17 views
-1

私はC#の新機能で、現在、名前付きパイプを使用してメッセージを相互に送信する単純なメッセンジャーアプリケーションに取り組んでいます。だから私は2つのWindows Formsアプリケーションプロジェクトが同じソリューションにあります。両方のフォームにはそれぞれNamedPipeClientStreamオブジェクトとNamedPipeServerStreamオブジェクトとStart Chatボタンがあります。スタートチャットボタンがクリックされたときに、次のコードが実行されます。NamedPipeServerStream.WaitForConnection()を別のスレッドで実行するにはどうすればいいですか?

 this.Text = "Server - Waiting for a connection...."; 
     clientPipe.Connect(); 
     serverPipe.WaitForConnection(); 


     if (serverPipe.IsConnected) 
     { 
      this.Text = "Server - You are connected!"; 
      toggleButtons(); 
      txtBoxMsg.Focus(); 
      this.startBackgroundWorker(receiveWorker); 
     } 

私は、フォームの一形態のみがフリーズ上のボタンをクリックして、私もそれを終了することができないとき。いくつかの研究をした後、WaitForConnection()メソッドは、別のスレッドで実行されていないとブロックしていることに気付きました。誰でもこの問題を解決する方法の例を説明することができますか?私はここで複数の質問を通して見て、私はそれが別のスレッドで実行する必要があることが判明したが、実際に与えられた例はなかった。

チャット開始ボタンをクリックしたときにフォームがフリーズするのを防ぐためにフォローを試みましたが、後でコードを実行する必要はありません。つまり、パイプは実際には接続されません。別々のスレッドでNamedPipeServerStream.WaitForConnection()を実行する方法

 Task.Run(() => 
     { 
      if (!serverPipe.IsConnected) 
      { 
       serverPipe.WaitForConnection(); 
      } 
     }).ContinueWith(_ => 
     { 
      if (serverPipe.IsConnected) 
      { 
       this.Text = "Client - You are connected!"; 
       // FileHandler.FileWriter("[CONVERSATION START: " + DateTime.Now + "]"); 
       toggleButtons(); 
       txtBoxMsg.Focus(); 
       this.startBackgroundWorker(receiveWorker); 
      } 
     }); 
+2

タスクの継続を避け( 'ContinueWith')、代わりに' await'を使うべきです。後者は、メソッドの戻り値の型では動作しない – MickyD

答えて

0

あなたのアプリケーションはI/Oを使用しているため、スレッドはI/O操作でスレッドがブロックされている時間が長いため、通常はスレッドを避けたいと考えています。スレッドは、演算処理のままにすることをお勧めします。代わりにTaskawaitを使用してください。

これを念頭に置いてNamedPipeServerStream.WaitForConnectionAsync()を使用してください。

private async void button1_Click(object sender, System.EventArgs e) // <---- note async 
{     
    await clientPipe.ConnectAsync(); // good idea to make this async too 
    await serverPipe.WaitForConnectionAsync(); // async 

    if (serverPipe.IsConnected) 
    { 
     this.Text = "Server - You are connected!"; 
     toggleButtons(); 
     txtBoxMsg.Focus(); 
     . 
     . // don't spawn thread here, rather use async pipe method calls 
     . // e.g. 

     var buffer = new byte[2048];    
     var bytesRead = await serverPipe.ReadAsync (buffer, 0, buffer.Length); 
    } 
} 

注:上記のコードは、プロジェクトに設定するには、.NET 4.6.2が必要です。

+0

の中でコードを読みやすくしています...「空きができません」というエラーが表示されます –

+0

両方のパイプで試しましたが、どちらも動作しません。 このメソッドは、質問に投稿する方法と同じです。私は両方のフォームで私はチャット開始ボタンをクリックすると、私は 'チャット'を開始することができますが、フォームのいずれかで開始チャットボタンをクリックすると、フォームが接続を待っているので、フリーズし、 Visual Studioに戻り、そこで停止することなくフォームを作成できます。 私が変更したいのは、チャットの開始ボタンをクリックしたときにフォームがフリーズしないようにすることでした。 –

+0

申し訳ありません。私は 'await clientPipe.ConnectAsync()'と 'await serverPipe.WaitForConnectionAsync()'を使用しようとしました。 –

関連する問題