C# 使用管道上的WaitForConnectionAsync()挂起

C# 使用管道上的WaitForConnectionAsync()挂起,c#,asynchronous,pipe,named-pipes,C#,Asynchronous,Pipe,Named Pipes,我正在通过命名管道与另一个进程通信。管道服务器是用C#实现的,客户端是用C编写的。服务器是一个WPF应用程序 我需要创建一个名为PipeServerStream的并(同步)等待1秒钟,以便客户端连接。然后我需要知道客户端是否已连接 由于NamedPipeServerStream取消/超时等待客户端连接的唯一方法是通过其异步WaitForConnectionAsync方法-该方法采用CancellationToken-我已经实现了我认为是同步等待的方法,如下所示: public bool Wait

我正在通过命名管道与另一个进程通信。管道服务器是用C#实现的,客户端是用C编写的。服务器是一个WPF应用程序

我需要创建一个名为PipeServerStream的
并(同步)等待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;
}