Unity Game Engine で実行されるコードがいくつかあります。そのコードの一部は、サーバー (IIS 8.0、Azure クラウド) でも実行されています。Unity は .Net Framework (3.5 またはそれに近いもの) のサブセットのみをサポートするため、現時点では async / await パターンをサポートしていません。
当然、私のサーバーは非同期メソッドを使用して完全に構築されています。問題は、Unity コードがサーバー メソッドの一部を呼び出す必要があり、await キーワードを使用できないことです。サーバー上で呼び出すことができるように、Unity コードのいくつかの基本的なメソッドを公開する必要があります。
たとえば、次のコードを使用できます。
Public bool Save()
{
Task.Run(async() => await PlayerService.SavePlayer());
return true;
}
これはもちろん問題なく動作しますが、save が完了する前にメソッド save が戻らないようにする必要があります。Save() メソッドに戻る前に、そのタスクが最後まで実行されるのを待つにはどうすればよいでしょうか。また、スレッドをブロックせずにこれを行いますか? メソッドをブロックしても問題ありません。
ところで。PlayerService.SavePlayer(); の側には大量の await 呼び出しがあります。
また、同期コンテキストの問題もあります。SignalR を介して最初の呼び出しを呼び出すときに、コンテキストが変更されると気に入らないようです。
ここで SignalR がどのように関与しているかを明確にするために、パターンの例を示します。
SignalR はメッセージを取得します -> これにより、モデル (Unity コード) のインスタンスがメモリから読み込まれます -> モデルは、その状態を保存するのに適していると判断し、サーバー メソッドを呼び出します -> Save() メソッドが呼び出されます -> 保存playerservices で非同期メソッドを呼び出します -> これは魔法です -> これは保存に戻ります -> モデルは保存が成功したことを確認し、そのビジネスを続けます。