当前位置: 首页 > news >正文

# .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方法。

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格式的,包含进度和描述字段。

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字符串。

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

相关文章:

  • yolov5单目测距+速度测量+目标跟踪(算法介绍和代码)
  • Fine-Tuning Language Models from Human Preferences
  • Android Studio配置国内镜像源和HTTP代理/解决:Android Studio下载gradle速度慢的问题
  • 【华为机试】2023年真题B卷(python)-矩阵元素的边界值
  • odoo 客制化审批流
  • [足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律
  • 电脑如何屏幕录制?轻松录制高清视频
  • Golang标准库sync的使用
  • 在Adobe Acrobat上如何做PDF文档签名
  • 在vim中映射类似于Windows编辑器的快捷键
  • 2024年网络安全竞赛-页面信息发现任务解析
  • 面试算法79:所有子集
  • 原生微信小程序如何动态配置主题颜色及如何调用子组件的方法
  • 爬虫与反爬-localStorage指纹(某易某盾滑块指纹检测)(Hook案例)
  • html js加载本地文件报错处理,跨域问题
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【技术性】Search知识
  • Android框架之Volley
  • angular2 简述
  • ES2017异步函数现已正式可用
  • express如何解决request entity too large问题
  • JavaScript创建对象的四种方式
  • JavaScript对象详解
  • JS学习笔记——闭包
  • leetcode98. Validate Binary Search Tree
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • python 装饰器(一)
  • Redis字符串类型内部编码剖析
  • VUE es6技巧写法(持续更新中~~~)
  • Vue2.x学习三:事件处理生命周期钩子
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 构建工具 - 收藏集 - 掘金
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 解析带emoji和链接的聊天系统消息
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 主流的CSS水平和垂直居中技术大全
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​什么是bug?bug的源头在哪里?
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (2)MFC+openGL单文档框架glFrame
  • (42)STM32——LCD显示屏实验笔记
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm电影分享网站
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)树状数组
  • .cn根服务器被攻击之后
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net core 控制台应用程序读取配置文件app.config