私は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);
}
});
タスクの継続を避け( 'ContinueWith')、代わりに' await'を使うべきです。後者は、メソッドの戻り値の型では動作しない – MickyD