.net core can';不使用wait on caller和callee?

.net core can';不使用wait on caller和callee?,.net-core,wampsharp,.net Core,Wampsharp,我正在用core3.1编写一个最简单的呼叫控制台应用程序。当我改变channel.Open().Wait(5000)时到等待频道。打开(),它在第proxy.Ping()行被阻塞 这也可以在被叫方上找到: Task openTask = channel.Open(); openTask.Wait(); 无法替换为wait channel.Open() Task registrationTask=realm.Services.RegisterCallee(实例); registrationTas

我正在用core3.1编写一个最简单的呼叫控制台应用程序。当我改变
channel.Open().Wait(5000)时
等待频道。打开(),它在第
proxy.Ping()行被阻塞

这也可以在被叫方上找到:

Task openTask = channel.Open();
openTask.Wait();
无法替换为
wait channel.Open()

Task registrationTask=realm.Services.RegisterCallee(实例);
registrationTask.Wait();
无法替换为
wait realm.Services.RegisterCallee(实例)

一旦使用wait,程序总是卡在第
proxy.Ping()行

解决方案


为什么?Wait不是在等待吗?

您的方法调用
proxy.Ping()
会阻止Websocket线程。如果使用异步语法,应小心不要阻塞Websocket线程。使用
await proxy.PingAsync()
版本。如果需要进行阻止调用,如
Console.ReadLine()
,请确保在进行阻止调用之前,通过调用
wait Task.Yield()
,释放Websocket线程。

“无法替换”,为什么不可以?如果您将
Wait
.Wait
混合使用,很可能其中一个正在阻塞另一个,您将陷入死锁。正确使用
.Wait
是很难做到的,可能是你在一两个地方引入
Wait
打乱了时间的微妙平衡。我似乎没有把Wait和Wait混为一谈。也许这对我来说不容易理解。你必须提供更多的代码才能回答这个问题。可能是,如果它与
.Wait
一起工作,而不是与
Wait
一起工作,则可能涉及的对象可能是线程绑定的,这意味着它们属于某个线程,并且只在该线程上工作。我已打包并上载了整个解决方案。。谢谢。您的ping方法正在阻止WebSocket线程。切换到
PingAsync
格式(推荐方法),或者在调用Ping之前添加一个
wait Task.Yield()
,以释放WebSocket线程(不太推荐)。是的,确实如此。也许它应该在WinForm中托管。
Task<IAsyncDisposable> registrationTask = realm.Services.RegisterCallee(instance);
registrationTask.Wait();