Я написал небольшое клиентское и серверное приложение, чтобы научиться использовать каналы. В каждом приложении у меня изначально были потоки в блоке использования, и я быстро обнаружил, что когда блок использования был закончен и он избавился от потока, он также удалил мои каналы.
Я избавился от использования блоков и сделал переменные-члены для потоков. Теперь моя проблема заключается в том, что когда я вызываю функцию ReadLine в StreamReader на клиенте, она не продолжается до тех пор, пока мое серверное приложение не будет закрыто (или, точнее, до тех пор, пока не будет ликвидирован StreamWriter).
Кажется странным, что мне пришлось бы создавать новый поток (и, соответственно, новый канал, поскольку каждый раз, когда поток закрывается, он также удаляет канал) для каждого сообщения, которое я хочу отправить. Что мне нужно изменить?
Код сервера:
class PipeServer
{
NamedPipeServerStream _pipeServer;
StreamWriter _sw;
public PipeServer(string pipeName)
{
_pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.Out);
_pipeServer.WaitForConnection();
_sw = new StreamWriter(_pipeServer) { AutoFlush = true };
}
public void WriteMessage(string message)
{
_sw.WriteLine(message);
}
}
Код клиента:
public delegate void MessageReadEventHandler(string message);
class PipeClient
{
public event MessageReadEventHandler MessageReadEvent;
NamedPipeClientStream _pipeClient;
StreamReader _sr;
public PipeClient(string pipeName)
{
_pipeClient = new NamedPipeClientStream(".", pipeName, PipeDirection.In);
_pipeClient.Connect();
_sr = new StreamReader(_pipeClient);
}
public void ReadMessages()
{
string temp;
while ((temp = _sr.ReadLine()) != null)
if (MessageReadEvent != null)
MessageReadEvent(temp);
}
}
Форма сервера содержит одно текстовое поле и имеет следующий код:
public partial class Form1 : Form
{
PipeClient pClient = new PipeClient("testpipe");
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e)
{
pClient.MessageReadEvent += o => { textBox1.Text = o; };
}
private void Form1_Shown(object sender, EventArgs e)
{
pClient.ReadMessages();
}
}
Форма клиента имеет одно текстовое поле и имеет следующий код:
public partial class Form1 : Form
{
PipeServer pServer = new PipeServer("testpipe");
public Form1() { InitializeComponent(); }
private void ServerTextBox_TextChanged(object sender, EventArgs e)
{
pServer.WriteMessage(ServerTextBox.Text);
}
}
Как видите, я пытаюсь вызывать событие каждый раз, когда отправляется сообщение, и хочу, чтобы канал оставался открытым и постоянно прослушивал сообщения.