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. 注意事项

  • 异步:避免数据竞争和死锁等问题
目录
相关文章
|
12天前
|
安全
【进程通信】信号的捕捉原理&&用户态与内核态的区别
【进程通信】信号的捕捉原理&&用户态与内核态的区别
|
12天前
|
Shell
【进程通信】利用管道创建进程池(结合代码)
【进程通信】利用管道创建进程池(结合代码)
|
19天前
|
Linux
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
|
19天前
|
Linux
【Linux】进程通信之匿名管道通信
【Linux】进程通信之匿名管道通信
|
4天前
|
消息中间件 Linux C语言
进程通信:管道与队列
进程通信:管道与队列
|
10天前
|
存储 安全 调度
【操作系统】进程控制与进程通信
【操作系统】进程控制与进程通信
21 3
|
12天前
|
NoSQL Linux Shell
【进程通信】了解信号以及信号的产生
【进程通信】了解信号以及信号的产生
|
12天前
【进程通信】Syetem V 共享内存(结合代码模拟通信)
【进程通信】Syetem V 共享内存(结合代码模拟通信)
|
12天前
【进程通信】用命名管道模拟server和client之间的通信
【进程通信】用命名管道模拟server和client之间的通信