Tôi không thể tìm thấy một ví dụ điển hình về cách tạo một bộ lắng nghe ống có thể tái sử dụng được chạy không đồng bộ. Tôi có thể làm cho người nghe tái sử dụng:Làm cách nào để bạn triển khai trình nghe ống có tên có thể tái sử dụng chạy không đồng bộ?
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
while (true)
{
pipeServer.WaitForConnection();
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
pipeServer.Disconnect();
}
và tôi có thể làm cho một người biết lắng nghe asychronous:
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);
Nhưng tôi dường như không thể có được cả hai đi. Có một ví dụ tốt cho điều này? Tôi cũng lo ngại về các thư được gửi một phần, vì tôi tin rằng đó là một vấn đề với các liên lạc không đồng bộ như thế này.
Cập nhật: Tôi gần hơn một chút.
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);
Điều đó sẽ đọc thành công một lần và sẽ tiếp tục lặp lại, với ReadLine trả về một chuỗi trống rỗng sau khi đọc thành công ban đầu. Vì vậy, nó rõ ràng không chặn, và đang cố đọc lại. Vấn đề là nếu tôi gửi cùng một tin nhắn lần thứ hai, nó không được chọn, và người viết ống của tôi nói rằng nó nhận được lỗi 2316 (mặc dù tôi không thể hiểu được điều đó có nghĩa là gì). Tôi nghĩ rằng tôi chỉ cần làm một cái gì đó tương tự như này, nơi các đường ống được làm sạch lên mỗi lần, giống như mẫu mã đầu tiên tôi liệt kê, nhưng tôi đã không nhận được rằng để làm việc được nêu ra.
Mã lỗi hệ thống (ví dụ: Win32 API) có tại đây: http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx Nhưng không có lỗi 2316 ... bạn có chắc chắn không đó là mã lỗi? Bạn có thể bao gồm đầy đủ chi tiết về ngoại lệ (bao gồm cả loại và thông báo không? – Richard
Xin lỗi, tôi không thấy điều này cho đến bây giờ và tôi không còn tạo lỗi nữa. Đây là mã tạo ra nó, vào cuối của nhà văn: if (ống == INVALID_HANDLE_VALUE) \t \t { \t \t \t cout << "lỗi:" << GetLastError(); \t \t} –
hóa ra đó là lỗi 231. 6 là đầu ra từ cái gì khác –