簡體   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