C#:异步NamedPipeServerStream理解

Posted

技术标签:

【中文标题】C#:异步NamedPipeServerStream理解【英文标题】:C#: Asynchronous NamedPipeServerStream understanding 【发布时间】:2012-07-11 14:46:33 【问题描述】:

我试图找到任何好的且清晰的异步 NamedPipeServerStream 示例,但找不到适合我的示例。

我想要一个 NamedPipe 服务器,它异步地接受来自客户端的消息。客户很简单,对我来说很好。但是我找不到服务器的例子,或者无法理解它是如何工作的。

现在据我了解,我需要创建 NamedPipeServerStream 对象。让我们这样做:

namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);

似乎有效。 但我不知道,我是否必须使用 PipeSecurity 或 PipeAccessRule?是吗? 我的服务器将作为本地系统中的 Windows 服务运行。

接下来呢?我想我需要使用 BeginWaitForConnection 进行异步连接。让我们看看:

namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);

问题 1:这是什么“奇怪的东西”?怎么用?

问题 2:我应该这样做

while(true)

namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);

让我的服务器总是等待连接?还是我需要以其他方式进行?

然后……我们来看看 WaitForConnectionAsyncCallback 函数:

private void WaitForConnectionAsyncCallback(IAsyncResult result)
        
            Console.WriteLine("Client connected.");
            byte[] buff = new byte[BUFFERSIZE];
            namedPipeServerStream.Read(buff, 0, namedPipeServerStream.InBufferSize);
            string recStr = General.Iso88591Encoding.GetString(buff, 0, namedPipeServerStream.InBufferSize);
            Console.WriteLine("   " + recStr);
            namedPipeServerStream.EndWaitForConnection(result);
        

..这当然行不通。因为 我不知道如何从流中接收字符串。如何? 现在它引发了一个 InvalidOperationException:

管道尚未连接。

那么如何使用 NamedPipeServerStream 组织异步工作呢?

【问题讨论】:

【参考方案1】:

您修改 PipeSecurity 以限制对管道的访问,只允许受祝福的程序连接到您的服务。把它放在次要位置,直到你完成这项工作并进行了安全分析,表明这种限制是合理的。

“一些奇怪的东西”只是一个可以传递给回调方法的任意对象。您并不经常需要它,但如果您编写回调以便它服务于多个连接,它会很有帮助。在这种情况下,您需要了解有关已连接的特定管道的更多信息,state 参数允许您传递该信息。在您的回调方法中,result.AsyncState 属性为您提供对该对象的引用。以后只需要担心它,您会在需要时找到它的用途。在那之前通过null

这是一个错误。在对管道执行任何其他操作之前,您必须先调用 EndWaitForConnection()。只需将其移动到方法的顶部即可。您通常希望将其写入 try/catch 中,以便捕获 ObjectDisposedException,即在退出程序之前关闭管道时将引发的异常。

【讨论】:

有点帮助。现在我正在接收来自客户端的消息,但每次收到消息后我都会遇到“管道正在关闭”异常。是什么原因?我在 EndWaitForConnection 之后立即调用 WaitForPipeDrain() 方法。也许这是一个错误的地方? 嗯,听起来很有帮助。我已经回答了三个问题,您需要点击第四个问题的按钮并正确记录。

以上是关于C#:异步NamedPipeServerStream理解的主要内容,如果未能解决你的问题,请参考以下文章

C# :异步编程的注意点

C#异步编程一

[C#] 异步编程 - 剖析异步方法

C#的异步回调函数

C#异步执行代码块

C#:异步NamedPipeServerStream理解