Я пробую IPC с именованными каналами в тестовом приложении, которое я написал для этой цели.Я хочу прочитать значение из канала, но читатель, похоже, ничего не читает.
Я запускаю процесс сервера и клиента.Сервер использует именованный канал с именем InitPipe
, чтобы сообщить клиенту имя нового канала для связи.После этого новый серверный процесс и клиент подключаются к новому каналу, другой серверный процесс и клиент отключаются, и InitPipe
вновь открывается, чтобы новые процессы могли взаимодействовать с сервером.Клиент записывает данные в канал, и новый серверный процесс должен прочитать данные.Вот в чем проблема.Похоже, сервер не получает значения с конвейера.
private void svr_task(string comPipe)
{
var server = new NamedPipeServerStream(comPipe);
write("Com-Pipe: " + comPipe); //'write' just writes to a TextBox on the UI thread
server.WaitForConnection();
write("Client connected: " + comPipe);
StreamReader reader = new StreamReader(server);
StreamWriter writer = new StreamWriter(server);
while (server.IsConnected)
{
var line = reader.ReadLine(); //the program doesn't seem to run past this line
write(line);
}
write("Client disconnected: " + comPipe);
server.Dispose();
write("Com-Pipe closed: " + comPipe);
}
private void cl_start()
{
//This is for InitPipe
var clientInit = new NamedPipeClientStream("InitPipe");
NamedPipeClientStream client = new NamedPipeClientStream("InitPipe");
clientInit.Connect();
Dispatcher.Invoke(() => stat_cl1.Content = "Initialize...");
StreamReader reader = new StreamReader(clientInit);
StreamWriter writer = new StreamWriter(clientInit);
while (clientInit.IsConnected)
{
var line = reader.ReadLine();
client = new NamedPipeClientStream(line);
clientInit.Dispose();
}
//This is where the communication with the server thread starts
client.Connect();
Dispatcher.Invoke(() => stat_cl1.Content = "Connected");
reader = new StreamReader(client);
writer = new StreamWriter(client);
while (client.IsConnected)
{
string line = Dispatcher.Invoke(() => box_cl1.Text); //read a value from a textbox (This works)
writer.Write(line);
writer.Flush();
}
client.Dispose();
Dispatcher.Invoke(() => stat_cl1.Content = "Not connected");
}
Я хочу, чтобы поток сервера получил значения из потока клиента.Поток пользовательского интерфейса не заблокирован, поэтому я могу запустить другого клиента, который также может подключаться к потоку сервера.При отладке в VS и пошаговом выполнении кода он просто запускается после var line = reader.ReadLine();
и, похоже, никогда не перейдет на следующую строку.Вот почему я думаю, что он не может прочитать какие-либо значения из канала.Но что мне нужно изменить?Я хочу вывести значение с помощью write
.