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

时间:2013-10-22 11:27:11

标签: c# asynchronous signalr

我有一些在Unity Game Engine下运行的代码。该代码的一部分也在服务器上运行(IIS 8.0,Azure Cloud)。由于Unity仅支持.Net Framework的一个子集(3.5或接近它的东西),因此目前不支持异步/等待模式。

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

例如,我可以使用以下代码:

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

这当然运行良好,但我需要确保在保存完成之前方法save不会返回。现在,如何在返回方法Save()之前等待该任务运行到最后?这样做而不阻塞线程?阻止该方法很好。

顺便说一下。在PlayerService.SavePlayer();

旁边有大量的等待调用

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

只是为了澄清SignalR如何涉及这个模式的一个例子:

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

1 个答案:

答案 0 :(得分:2)

  

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

在这种情况下,您可Wait Task返回Task.Run。这不是一个最佳解决方案(这是一个黑客攻击),但除非Unity支持await,否则你无法拥有最佳解决方案。

  

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

那是不可能的。您正在向Unity公开同步方法,并且当同步方法返回时,它已完成。所以你来阻止线程或在启动异步操作后返回(就像你的代码已经在做)。

  

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

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