我是C#的新手,目前正在使用命名管道將消息發送給對方的簡單消息傳遞應用程序。所以我有兩個Windows Forms應用程序項目在同一個解決方案中。兩個表單都有一個NamedPipeClientStream對象和一個NamedPipeServerStream對象和一個開始聊天按鈕。點擊開始聊天按鈕時,將執行以下代碼:如何在單獨的線程上運行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()方法不是在單獨的線程上運行的話,它將被阻塞。任何人都可以解釋或展示一個例子來解決這個問題嗎?我在這裏查看了多個問題,我發現所有問題都需要在單獨的線程上運行,但實際上從來沒有給出過例子。
我也嘗試了下面的代碼,它可以防止窗體在單擊開始聊天按鈕時被凍結,但之後沒有更多的代碼被執行,這意味着在這種嘗試中管道實際上並沒有互相連接。
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