C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版

简介: 主要类1.NamedPipeClientStream2.NamedPipeServerStream解释:命名管道是一种进程间通信的方式,它允许不同进程之间在同一台机器上进行通信

1. 需求背景

  • 两个进程间数据通信
  • 简易好用,不易出bug
  • 避免卡UI

综上:那么命名管道异步通信,是比较好的选择!

2. 技术评价

使用管道共享异步接收和发送数据的方法具有以下优缺点:

优点:

  1. 异步操作:管道共享机制可以使用异步方法进行数据接收和发送,这提供了更高的并发性和响应性。
  2. 高效性:管道共享机制在进程间通信中提供了高效的数据传输方式,可以在进程之间以低延迟和高吞吐量的方式传输数据。
  3. 可靠性:管道共享机制提供了可靠的数据传输方式,确保数据能够按照顺序传输,并且在数据的发送和接收之间进行同步。

缺点:

  1. 单向性:管道共享机制默认为单向管道,即只能从一端接收数据,而需要通过另一端发送数据。如果需要双向通信,需要创建两个管道进行通信。
  2. 进程限制:管道共享机制只适用于同一台计算机上运行的进程之间的通信,不支持跨网络的通信。
  3. 具有一定的复杂性:使用管道共享的异步接收和发送数据可能需要处理一些并发和同步的问题,例如管道的连接等。

3. 应用场景

网络通信:命名管道可以用于在本地网络中的不同计算机上的程序之间进行通信。通过使用命名管道,可以实现跨计算机的进程间通信,例如客户端-服务器应用程序


IPC:命名管道可用于同一计算机中的不同进程之间的进程间通信(IPC)。通过使用命名管道,可以在同一计算机上的不同程序之间共享数据和信息,例如两个独立的应用程序共享数据


多线程通信:命名管道可用于同一程序中的不同线程之间的线程间通信。通过使用命名管道,可以实现多个线程之间的数据共享和通信,例如一个线程产生数据,另一个线程处理数据


服务与应用程序通信:命名管道可用于服务和应用程序之间的通信。服务可以使用命名管道接收应用程序发送的请求,并将结果发送回应用程序,从而实现服务和应用程序之间的交互

4. 代码示例

4.1 异步-推荐用法

  1. 接受数据
privatestaticNamedPipeServerStreamserverStream;//建议设置为静态,否则易导致命名管道冲突privatestaticasyncTaskReceiveDataAsync()
{   
//创建命名管道-serverserverStream=newNamedPipeServerStream("mypipe", PipeDirection.InOut, 1,PipeTransmissionMode.Byte, PipeOptions.Asynchronous);//Asynchronous为启用异步//等待连接awaitserverStream.WaitForConnectionAsync();
awaitTask.Run(async () =>            {
//申请内存byte[] buffer=newbyte[1024];
//循环监控-如果不需要持续获取,可以删除whliewhile (true)
                {
//等待1秒awaitTask.Delay(1000);
//将管道消息给bufferintbytesRead=awaitserverStream.ReadAsync(buffer, 0, buffer.Length);
// 判断是否为空.为空则关闭if (bytesRead==0)
                    {
break;
                    }
//将byte[]转换至stringstringreceivedData=Encoding.UTF8.GetString(buffer, 0, bytesRead);
//显示接收的消息Console.WriteLine("Received: "+receivedData);
// 在这里可以对接收到的数据进行处理             }
     });
// 在这里可以进行其他操作}

发送数据

privatestaticNamedPipeClientStreamclientStream;//建议设置为静态,否则易导致命名管道冲突privateasyncTaskSendMessage()
{
//创建命名管道-clientclientStream=new(".", "mypipex", PipeDirection.Out, PipeOptions.Asynchronous);
// 连接到命名管道服务器awaitclientStream.ConnectAsync();
// 要发送的消息stringmessageToSend="发送的消息";
//转为byte[]byte[] data=Encoding.UTF8.GetBytes(messageToSend);
//发送消息awaitclientStream.WriteAsync(data, 0, data.Length);
//刷新awaitclientStream.FlushAsync();
}


5. 注意事项

  • 异步:避免数据竞争和死锁等问题
目录
相关文章
|
15天前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
32 11
|
17天前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
42 10
|
15天前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
15天前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
17天前
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
|
2月前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
2月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
2月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
93 3
|
2月前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
2月前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)