C# 使用管道上的WaitForConnectionAsync()挂起
我正在通过命名管道与另一个进程通信。管道服务器是用C#实现的,客户端是用C编写的。服务器是一个WPF应用程序 我需要创建一个名为PipeServerStream的C# 使用管道上的WaitForConnectionAsync()挂起,c#,asynchronous,pipe,named-pipes,C#,Asynchronous,Pipe,Named Pipes,我正在通过命名管道与另一个进程通信。管道服务器是用C#实现的,客户端是用C编写的。服务器是一个WPF应用程序 我需要创建一个名为PipeServerStream的并(同步)等待1秒钟,以便客户端连接。然后我需要知道客户端是否已连接 由于NamedPipeServerStream取消/超时等待客户端连接的唯一方法是通过其异步WaitForConnectionAsync方法-该方法采用CancellationToken-我已经实现了我认为是同步等待的方法,如下所示: public bool Wait
并(同步)等待1秒钟,以便客户端连接。然后我需要知道客户端是否已连接
由于NamedPipeServerStream
取消/超时等待客户端连接的唯一方法是通过其异步WaitForConnectionAsync
方法-该方法采用CancellationToken
-我已经实现了我认为是同步等待的方法,如下所示:
public bool WaitOneSecondForClientConnect()
{
bool result = false;
try
{
result = WaitForConnectionAsyncSyncWrapper().Result;
}
catch (AggregateException e)
{
log.Write("Error waiting for pipe client connect: " + e.InnerException.Message);
}
return result;
}
private async Task<bool> WaitForConnectionAsyncSyncWrapper()
{
CancellationTokenSource cts = new CancellationTokenSource(1000);
await pipe.WaitForConnectionAsync(cts.Token);
return pipe.IsConnected;
}
private静态异步任务ConnectAsync(NamedPipeServerStream-pipe)
{
CancellationTokenSource cts=新的CancellationTokenSource(1000);
wait pipe.WaitForConnectionAsync(cts.Token);
回流管未连接;
}
不能像这样混合使用异步和非异步方法。发生的情况是,您的WaitOneSecondForClientConnect
方法正在等待waitForConnectionAsyncWrapper
方法完成。但那个家伙需要它的调用线程是自由的,这样它才能重新水化原始上下文。所以你刚刚造成了僵局。有关详细信息,请参阅
相反,您需要一直异步
public async Task<bool> WaitOneSecondForClientConnect()
{
bool result = false;
try
{
result = await WaitForConnectionAsyncSyncWrapper();
}
catch (Exception e)
{
log.Write("Error waiting for pipe client connect: " + e.Message);
}
return result;
}
public异步任务WaitOneSecondForClientConnect()
{
布尔结果=假;
尝试
{
结果=等待WaitForConnectionAsyncWrapper();
}
捕获(例外e)
{
log.Write(“等待管道客户端连接时出错:+e.Message”);
}
返回结果;
}
您没有正确使用async/await可能没有-您能详细说明一下吗?您的问题太长了,我无法完全理解并制定一个答案来解释在WPF/WinForms/ASP.Net中调用.Result
时出现的死锁。你的帖子很好地展示了你在发现问题上所付出的努力——这是值得称赞的。很好,这个链接将我的问题描述为一个T(包括为什么它在我的测试代码中工作,而不是在我的GUI应用程序中工作)。现在几乎可以肯定有一种更好或“更正确”的方法来实现这一点,因为我是async/await新手;因此,为了使方法同步,我将代码保持原样,但通过将ConfigureAwait(false)
添加到await pipe.WaitForConnectionAsync(cts.Token)
的末尾来防止死锁,因此它在线程池上执行其余的代码,并且工作正常!
private static async Task<bool> ConnectAsync(NamedPipeServerStream pipe)
{
CancellationTokenSource cts = new CancellationTokenSource(1000);
await pipe.WaitForConnectionAsync(cts.Token);
return pipe.IsConnected;
}
public async Task<bool> WaitOneSecondForClientConnect()
{
bool result = false;
try
{
result = await WaitForConnectionAsyncSyncWrapper();
}
catch (Exception e)
{
log.Write("Error waiting for pipe client connect: " + e.Message);
}
return result;
}