C# 创建匿名管道

c503e3e4f13a1c22064d55778c2064b9.png

下面对匿名管道执行类似的操作。通过匿名管道,创建两个彼此通信的任务。为了给管道的创建发出信号,使用 ManualResetEventSlim 对象,与内存映射文件一样。在 Program 类的 Run 方法中,创建两个任务,调用 Reader 和 Writer 方法:

private string _pipeHandle; 
private ManualResetEventSlim _pipeHandleSet; 


static void Main()
{
  var p = new Program(); 
  p.Run(); 
  Console.ReadLine();
}


public void Run()
{ 
  _pipeHandleSet = new ManualResetEventSlim(initialState: false); 
  Task.Run(() => Reader()); 
  Task.Run(() => Writer());
  Console.ReadLine();
}

0457fc0fbb8e279d290e0ebbe3d4c05e.png

创建一个 AnonymousPipeServerStream,定义 PipeDirection.In,把服务器端充当读取器。通信的另一端需要知道的客户端句柄。这个句柄在GetClientHandleAsString 方法中转换为一个字符串,赋予 _pipeHandle 变量。这个变量以后由充当写入器的客户端使用。在最初的处理后,管道服务器可以作为一个流,因为它本来就是一个流:

private void Reader() 
{
  try
  {
    var pipeReader = newAnonymousPipeServerStream(PipeDirection.In,
      HandleInheritability.None);
    using (var reader = new StreamReader(pipeReader))
    {
      _pipeHandle = pipeReader.GetClientHandleAsString(); 
      Console.WriteLine($"pipe handle: {_pipeHandle}"); 
      _pipeHandleSet.Set(); 
      bool end = false; 
      while (!end)
      {
        string line = reader.ReadLine(); 
        Console.WriteLine(line);
        if (line == "end") end = true;
      }
      Console.WriteLine("finished reading");
    }
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.Message);
  }
}

1ddff4b5a9d8fda3cc73261cc0565de2.png

客户端代码等到变量 _pipeHandleSet 发出信号,就打开由 _pipeHandle 变量引用的管道句柄。后来的处理用 StreamWriter 继续:

private void Writer()
{
  Console.WriteLine("anonymous pipe writer");
  _pipeHandleSet.Wait();
  var pipeWriter = new AnonymousPipeClientStream( 
    PipeDirection.Out, _pipeHandle);
  using (var writer = new StreamWriter(pipeWriter))
  {
    writer.AutoFlush = true;
    Console.WriteLine("starting writer");
    for (int i = 0; i < 5; i++)
    {
      writer.WriteLine($"Message {i}");
      Task.Delay(500).Wait();
    }
    writer.WriteLine("end");
  }
}

859d4e860d2fa6160233f311edb98a27.png

运行应用程序时,两个任务就相互通信,在任务之间发送数据。

f363c8d07378758b51e90ead80067c8c.png

9075b9fb82b2d868c8a78bf602402337.png

 微信公众号 

DotNet讲堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值