C# 创建匿名管道
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 创建匿名管道相关的知识,希望对你有一定的参考价值。
下面对匿名管道执行类似的操作。通过匿名管道,创建两个彼此通信的任务。为了给管道的创建发出信号,使用 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();
创建一个 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);
客户端代码等到变量 _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");
运行应用程序时,两个任务就相互通信,在任务之间发送数据。
微信公众号
DotNet讲堂
以上是关于C# 创建匿名管道的主要内容,如果未能解决你的问题,请参考以下文章