# .NET Framework中使用命名管道进行进程间通信

.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应用程序来说是理想的选择。

相关推荐
我是唐青枫19 小时前
C#.NET StructureMap 从依赖注入到项目实战
开发语言·c#·.net
Lost of 程序猿21 小时前
C# 12 / .NET 9 新特性机制深度:编译器替你写了什么,哪些糖吃下去会出事
windows·c#·.net
唐青枫2 天前
C#.NET StructureMap 从依赖注入到项目实战
c#·.net
智码看视界2 天前
.NET 10 推理大模型TensorSharp 3.3.0 部署实测:纯.NET推理引擎反超llama.cpp 1.5倍,DFlash2提速62%
c#·.net·llama.cpp·.net 10·tensorsharp·本地大模型推理·开源推理引擎
唐青枫2 天前
别把日志、权限写进业务方法:C#.NET 动态代理从原理到实战
c#·.net
风云2 天前
Vane.Dispatch 1.0.0 发布:一个与容器、传输层零耦合的 .NET 服务分发引擎
微服务·mvc·.net·ndf·vane.dispatch
张人玉3 天前
基于 C# WinForms + .NET 8 + SQLite + TCP Socket 的多连接通讯调试工具——TCP通讯助手(TcpAssistant)
tcp/ip·sqlite·c#·.net
mldong3 天前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
风云3 天前
MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架
开源·c#·.net·日志·高性能·minilog