.NET Framework中使用命名管道进行进程间通信
在.NET应用程序中,进程间通信(IPC)是一项常见需求。命名管道提供了一种高效、可靠的方式来在独立运行的进程之间传输数据。本文将展示如何在.NET Framework环境下创建一个WinForms管道客户端应用程序和一个控制台管道服务器应用程序。
WinForms 管道客户端(PipeClientForm.cs)
WinForms应用程序将作为管道的客户端,接收来自服务器的数据,并更新其UI。
初始化项目和控件
首先,在Visual Studio中创建一个新的WinForms应用程序。在主窗体上,我们添加一个ProgressBar
和一个Label
控件,用于显示从管道接收到的数据。
实现管道连接逻辑
我们使用NamedPipeClientStream
来连接到命名管道服务器。由于.NET Framework 4.5.2
不支持ConnectAsync
方法,我们将在后台任务中使用同步的Connect
方法。
csharp
private void ConnectToPipeServer()
{
reconnectTimer.Stop();
if (pipeClient != null && pipeClient.IsConnected)
{
return;
}
Task.Run(() =>
{
try
{
pipeClient = new NamedPipeClientStream(".", "TestPipe", PipeDirection.In);
pipeClient.Connect(10000); // 10秒超时
reader = new StreamReader(pipeClient);
BeginListening();
}
catch (Exception ex)
{
BeginInvoke(new Action(() => MessageBox.Show($"Error connecting to pipe: {ex.Message}")));
reconnectTimer.Start();
}
});
}
读取和处理数据
使用StreamReader
读取从管道接收到的数据。我们假设数据是JSON格式的,包含进度和描述字段。
csharp
private void BeginListening()
{
try
{
while (!reader.EndOfStream)
{
var message = await reader.ReadLineAsync();
UpdateUI(message);
}
}
catch (Exception ex)
{
BeginInvoke(new Action(() => MessageBox.Show($"Error reading from pipe: {ex.Message}")));
reconnectTimer.Start();
}
}
实现重连机制
如果连接失败,我们希望客户端能够自动重试。我们使用System.Windows.Forms.Timer
来实现这一点。
控制台应用程序作为管道服务器
在另一个项目中,我们创建一个控制台应用程序来作为管道的服务器。
发送数据
服务器使用NamedPipeServerStream
发送数据。我们将数据格式化为JSON字符串。
csharp
private static async Task SendMessageAsync(NamedPipeServerStream pipeStream, PipeMessage message)
{
var jsonString = JsonConvert.SerializeObject(message);
byte[] buffer = Encoding.UTF8.GetBytes(jsonString + "
");
await pipeStream.WriteAsync(buffer, 0, buffer.Length);
}
运行和测试
启动服务器应用程序并等待客户端连接。接着,运行WinForms客户端应用程序。客户端应该能够连接到服务器,并开始接收数据。
总结
本文展示了如何在.NET Framework中使用命名管道进行IPC。通过命名管道,我们能够在独立的进程之间高效地传输数据,这对于需要快速、轻量级IPC的.NET应用程序来说是理想的选择。