0

我有一些在 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 中调用异步方法 -> 这很神奇 -> 返回保存 -> 模型看到保存成功并继续执行其业务。

4

1 回答 1

2

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

在这种情况下,您可以Wait通过. 这不是最佳解决方案(这是一个 hack),但除非 Unity 支持,否则您无法获得最佳解决方案。TaskTask.Runawait

在不阻塞线程的情况下也这样做?

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

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

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

于 2013-10-22T12:08:20.627 回答