【问题标题】:can't use await on caller and callee?不能在调用者和被调用者上使用等待?
【发布时间】: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 线程(不太推荐)。

标签: .net-core wampsharp


【解决方案1】:

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

【讨论】:

  • 是的,确实如此。 Ths.Maybe它应该托管在WinForm中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多