我找不到一個很好的示例,說明如何創建異步運行的可重用命名管道偵聽器。我可以做一個可重複使用的監聽器:如何實現異步運行的可重用的命名管道偵聽器?
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
while (true)
{
pipeServer.WaitForConnection();
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
pipeServer.Disconnect();
}
,我可以做一個聽者臺異步:
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
}, null);
但我似乎無法得到這兩個去。這是否有一個很好的例子?我還擔心部分發送的消息,因爲我認爲這是異步通信的問題。
更新: 我更接近一點。
pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
while (running)
{
String text = reader.ReadLine();
if (String.IsNullOrEmpty(text) == false)
{
MessageBox.Show(text);
}
}
MessageBox.Show("Done!");
}, null);
這將讀取成功一次,並將繼續循環,ReadLine在初始成功讀取後返回一個空的空字符串。所以它顯然不會阻止,並且正在嘗試再次閱讀。問題是如果我再次發送相同的消息,它不會被拾取,並且我的管道編寫者說它正在接收錯誤2316(儘管我無法弄清楚這意味着什麼)。我想我只需要做一些類似這樣的事情,每次都會清理管道,就像我列出的第一個代碼示例一樣,但我還沒有完成這項工作。
系統(即Win32 API)錯誤代碼在這裏:http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx但沒有錯誤2316 ...你確定那是錯誤代碼?你能否包括例外的全部細節(包括類型和消息?) – Richard 2010-09-28 15:54:17
對不起,我直到現在纔看到這個,我不再產生這個錯誤,這是在作者的最後產生它的代碼:如果(管== INVALID_HANDLE_VALUE) \t \t { \t \t \t的cout << 「錯誤:」 << GetLastError函數(); \t \t} – 2010-09-28 20:12:34
事實證明這是錯誤231.從別的東西的6輸出 – 2010-10-07 18:29:09