繁体   English   中英

在同步方法中等待异步方法而不阻塞线程

[英]Waiting async method inside sync method without blocking the thread

我有一些在 Unity 游戏引擎下​​运行的代码。 该代码的一部分也在服务器(IIS 8.0、Azure Cloud)上运行。 由于 Unity 仅支持 .Net Framework 的一个子集(3.5 或接近它的版本),因此目前不支持 async/await 模式。

当然,我的服务器是完全使用异步方法构建的。 问题是 Unity 代码需要调用我的一些服务器方法并且它不能使用 await 关键字。 我需要为 Unity 代码公开一些基本方法,以便它可以在服务器上调用它们。

例如,我可以有以下代码:

   Public bool Save()
   {
       Task.Run(async() => await PlayerService.SavePlayer());
       return true;
   }

这当然运行良好,但我需要确保方法 save 在保存完成之前不会返回。 现在我如何等待该任务运行到最后才返回到 Save() 方法? 也可以在不阻塞线程的情况下执行此操作? 阻止该方法很好。

顺便说一句。 PlayerService.SavePlayer() 中有大量的 await 调用;

还有同步上下文的问题,似乎在通过 SignalR 调用初始调用时,如果上下文发生变化,它就不喜欢。

只是为了澄清 SignalR 在这里是如何参与的,这是模式的一个例子:

SignalR 收到一条消息 -> 这会从内存中加载模型的实例(Unity 代码) -> 模型认为现在是保存其状态并调用服务器方法的好时机 -> 调用 Save() 方法 -> 保存在 playerservices 中调用异步方法 -> 这很神奇 -> 返回保存 -> 模型看到保存成功并继续做它的业务。

现在我如何等待该任务运行到最后才返回到 Save() 方法?

在这种情况下,你可以WaitTask通过返回Task.Run 这不是最佳解决方案(这是一个黑客),但除非 Unity 支持await否则您无法获得最佳解决方案。

也可以在不阻塞线程的情况下执行此操作?

那是不可能的。 您正在向 Unity 公开一个同步方法,当同步方法返回时,它就完成了。 所以你必须要么阻塞线程,要么在开始异步操作后返回(就像你的代码已经在做的那样)。

还有同步上下文的问题,似乎在通过 SignalR 调用初始调用时,如果上下文发生变化,它就不喜欢。

SignalR 1.x 有一些关于SynchronizationContext怪癖。 SignalR 2.0 刚刚发布(他们应该修复那个版本中的那些怪癖); 我会尝试升级,看看它是否更好用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM