У меня есть два процесса (оба .NET Framework
приложения), и я пытаюсь связаться с помощью Named Pipes
Клиент подключается к каналу, но когда он пытается ReadAsync
сообщение, отправленное сервером, он начинает ждать индиффинно, даже если сервер уже отправил сообщение !!
Что меня удивляет, так это то, что если я закрою приложение Server
, то Client
наконец продолжит доследующая строка кода (после строки ReadAsync
), прочитав 0 байт.
Есть ли что-то, что я должен сделать на сервере после WriteAsync
-ing полезной нагрузки?Нужно ли сбрасывать или что-нибудь?
Сервер
static async Task Main(string[] args) {
var server = new NamedPipeServerStream(
"somePipe",
PipeDirection.InOut,
2,
PipeTransmissionMode.Message
);
await server.WaitForConnectionAsync();
using (StreamReader reader = new StreamReader(server)) {
using (StreamWriter writer = new StreamWriter(server)) {
await writer.WriteAsync("Hello from server");
char[] buffer = new char[20];
var read = await reader.ReadAsync(buffer, 0, buffer.Length);
}
}
}
Клиент
static async Task Main() {
NamedPipeClientStream client = new NamedPipeClientStream(
".",
"somePipe",
PipeDirection.InOut,
PipeOptions.Asynchronous);
await client.ConnectAsync();
try {
using (StreamReader reader = new StreamReader(client)) {
using (StreamWriter writer = new StreamWriter(client)) {
var buffer = new char[20];
int readChars = await reader.ReadAsync(buffer, 0,buffer.Length); //starts waiting indifinetly , until i close the Server
await writer.WriteAsync("From Client");
}
}
} catch (Exception ex) {
throw;
}
}
Обновление Кажется, использование NamedPipeServerStream
непосредственно для записи вместо StreamWriter
на стороне сервера заставляет клиента получать данные!
Изменения сервера
byte[] data=Encoding.UTF8.GetBytes("Hello from server");
server.WriteAsync(data,0,data.Length);
PS Однако повторное использование server
до ReadAsync
блокирует сервер. Таким образом, существует проблема при переносе NamedPipeServerStream
и ClientStream
в StreamReader
и StreamWriter
.