- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是第一次尝试使用命名管道。在 MS 文档中找到 here ,它指出:
EndWaitForConnection must be called exactly once for every call to BeginWaitForConnection.
所以我想成为一名优秀的小程序员并遵循文档,但是 EndWaitForConnection()
在我使用它时会无限期地挂起。
所以我将我的代码精简到最低限度,看看我是否可以隔离问题但没有骰子。我从我编写的类(class)中提取了以下代码。我对其进行了修改,使其开始等待管道连接,然后立即尝试停止等待该管道连接:
private void WaitForConnectionCallBack(IAsyncResult result)
{
}
public void Start()
{
var tempPipe = new NamedPipeServerStream("TempPipe",
PipeDirection.In,
254,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous);
IAsyncResult result = tempPipe.BeginWaitForConnection(
new AsyncCallback(WaitForConnectionCallBack), this);
tempPipe.EndWaitForConnection(result); // <----- Hangs on this line right here
}
1) 为什么它卡在 EndWaitForConnection()
上?如果我想在接收到连接之前关闭我的服务器,我该如何取消这个 BeginWaitForConnection()
回调?
2) 假设我没有遇到上述问题。如果 2 个客户端尝试快速连接到我的命名管道会怎样?
我是否为它们中的每一个都获得回调调用,或者我是否必须等待接收第一个连接通知然后快速调用 EndWaitForConnection()
然后 WaitForConnectionCallBack()
再次开始监听下一个客户?
后者对我来说似乎是一种竞争条件,因为我可能没有足够快地设置连接监听器。
最佳答案
因此,适用于我的解决方案的基本框架如下:
private void WaitForConnectionCallBack(IAsyncResult result)
{
try
{
PipeServer.EndWaitForConnection(result);
/// ...
/// Some arbitrary code
/// ...
}
catch
{
// If the pipe is closed before a client ever connects,
// EndWaitForConnection() will throw an exception.
// If we are in here that is probably the case so just return.
return;
}
}
这是服务器代码。
public void Start()
{
var server= new NamedPipeServerStream("TempPipe",
PipeDirection.In,
254,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous);
// If nothing ever connects, the callback will never be called.
server.BeginWaitForConnection(new AsyncCallback(WaitForConnectionCallBack), this);
// ... arbitrary code
// EndWaitForConnection() was not the right answer here, it would just wait indefinitely
// if you called it. As Hans Passant mention, its meant to be used in the callback.
// Which it now is. Instead, we are going to close the pipe. This will trigger
// the callback to get called.
// However, the EndWaitForConnection() that will excecute in the callback will fail
// with an exception since the pipe is closed by time it gets invoked,
// thus you must capture it with a try/catch
server.Close(); // <--- effectively closes our pipe and gets our
// BeginWaitForConnection() moving, even though any future
// operations on the pipe will fail.
}
关于c# - NamedPipeServerStream.EndWaitForConnection() 在使用时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145438/
我想知道是否可以限制远程机器访问服务器中的命名管道。我正在按如下方式初始化服务器: NamedPipeServerStream pipeServer = new NamedPipeServerStr
我从我的一位用户那里收到一条 Event Viever 条目,说发生了未经授权的访问异常。该进程从作为 SYSTEM 的服务启动。我能够将错误范围缩小到创建 NamedPipeServerStream
我有两个应用程序通过 NamedPipes 相互通信。我们称它们为 appServer(服务器)和 appClient(客户端)。他们成功连接并在一段时间内来回发送数据。然后,appClient 出乎
我正在设置命名管道服务器并从服务器管道读取...我允许 5 个可能的并发连接,它们是这样设置的。 Public Sub Start() Dim i As Integer While i
我想用 NamedPipeServerStream在应用程序的实例之间做一些小的 IPC。但是,如果服务器与客户端位于同一个终端服务器 session 上(如果应用程序在 TS 环境中运行),我只想将
我有一个使用 NamedPipeClientStream 的客户端和一个使用 NamedPipeServerStream 的服务器。 客户端可能在服务器之前启动,当它调用 clientStream.C
我目前正在为 NamedPipeServerStream 编写一个小包装器/NamedPipeClientStream那是完全Event基于而不是使用 AsyncCallbacks . 我为几乎所有可
我正在使用 NamedPipeServerStream 在两个进程之间进行通信。这是我初始化和连接管道的代码: void Foo(IHasData objectProvider) { Stre
我正在尝试在托管和非托管进程之间执行一些 IPC。我选择了命名管道。 我正在托管代码中启动一个线程,使用 NamedPipeServerStream : using (NamedPipeServerS
我是第一次尝试使用命名管道。在 MS 文档中找到 here ,它指出: EndWaitForConnection must be called exactly once for every call
目前在 .NET 中编写 Windows 服务,我正在使用命名管道让其他进程与我的服务进行通信。在更复杂的 NamedPipeServerStream 构造函数中,有一个参数,其描述性名称为 maxN
在使用NamedPipeServerStream类时,令我烦恼的是,对于每个传入连接,我需要创建新对象并调用它的方法WaitForConnection。 我想要做的是创建一个 NamedPipeSer
我对服务器/客户端架构有以下要求: 编写异步工作的服务器/客户端。 通信需要是双工的,即两端都可以读取和写入。 多个客户端可以在任何给定时间连接到服务器。 服务器/客户端应等待,直到它们可用并最终建立
文章C# Named Pipes with Async ,它是为 Async CTP 库 v3.0 编写的,使用的代码不能用 .NET 4.5 编译。具体 await pipe.WaitForConn
我正在尝试使用两个简单的 C# 表单解决方案在我的 Win-XP 工作站上实现双向命名管道通信。一种用于客户端,一种用于服务器。它们看起来几乎相同,并使用 NamedPipeServerStream
我正在尝试弄清楚如何在线程之间使用命名管道来传递类/结构/等等(我正在尝试使用秒表测量一些性能并将其与其他方法进行比较..) 无论如何,我找到的所有文档都在谈论使用 StreamReader 和 re
我想知道为什么 NamedPipes 存在于 .Net 中,如果我有一个应用程序想要创建某种代理来拦截其与目标服务器的连接,我将如何从中受益。 我想使用 NamedPipes 实现的是为 Minecr
我正在尝试使用命名管道在 Windows 服务和 WPF 应用程序之间进行通信,两者都是用 VB.Net 编写的。 Windows 服务一直在运行。 但是,在运行 WPF 应用程序几个小时后,将引发
我之前关于同一主题的问题:C#: Asynchronous NamedPipeServerStream understanding现在我有下一个: private void StartListenin
我正在使用 NamedPipeStream、客户端和服务器,我正在从客户端向服务器发送数据,数据是一个包含二进制数据的序列化对象。 当服务器端接收数据时,它总是有 MAX 1024 大小,而客户端发送
我是一名优秀的程序员,十分优秀!