【发布时间】:2020-07-10 07:34:06
【问题描述】:
我正在根据article 使用 core3.1 编写一个最简单的调用者控制台应用程序。当我将channel.Open().Wait(5000); 更改为await channel.Open(); 时,它卡在proxy.Ping(); 行。
这也可以在被调用者身上找到:
Task openTask = channel.Open();
openTask.Wait();
不能替换为await channel.Open();
Task<IAsyncDisposable> registrationTask = realm.Services.RegisterCallee(instance);
registrationTask.Wait();
不能替换为await realm.Services.RegisterCallee(instance);
一旦使用await,程序总是卡在proxy.Ping();行
解决方案zipfile。
为什么?不是在等待吗?
【问题讨论】:
-
“无法替换”,为什么不呢?如果您将
await和.Wait混合使用,很可能其中一个会阻塞另一个,那么您就会陷入僵局。正确使用.Wait很难实现,可能是您在一两个地方引入await打乱了微妙的时机平衡。 -
我好像没有把await和wait混为一谈。也许我不太容易理解。
-
您必须提供更多代码才能回答此问题。如果它与
.Wait一起工作,但不适用于await,则可能是所涉及的对象可能是线程绑定的,这意味着它们属于某个线程并且只能在该线程上工作。 -
我已经打包并上传了整个解决方案。zip。谢谢。
-
您的 ping 方法阻塞了 WebSocket 线程。切换到
PingAsync格式(推荐方法)或在调用 Ping 之前添加await Task.Yield()以释放 WebSocket 线程(不太推荐)。