我有一些在 Unity Game Engine 下运行的代码。该代码的一部分也在服务器(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() 中有大量等待调用;
还有同步上下文的问题,似乎在通过 SignalR 调用初始调用时它不喜欢上下文发生变化。
只是为了澄清 SignalR 是如何在这里涉及的,是该模式的一个示例:
SignalR 收到一条消息 -> 这会从内存中加载模型的实例(Unity 代码) -> 然后模型认为现在是保存其状态并调用服务器方法的好时机 -> 调用 Save() 方法 -> 保存在 playerservices 中调用异步方法 -> 这很神奇 -> 返回保存 -> 模型看到保存成功并继续执行其业务。