using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using UnityEngine; using CloudPointRpc; using System.Runtime.CompilerServices; public class RpcTest : MonoBehaviour { private static Queue _callbackTasks = new Queue(); private static BlendShaderController controller; [AOT.MonoPInvokeCallback(typeof(CrpcTestApi.RpcStringCallback))] public static IntPtr RpcStringCallback(IntPtr rpcString) { var rpc = new RpcString(rpcString); var message = rpc.Data; rpc.Dispose(); var tcs = new TaskCompletionSource(); var task = new Task(async () => { Debug.Log($"[RpcTest] Callback received: {message}"); controller.SaveTextureAsync(tcs); Debug.Log("After Saving inside task"); }); lock (_callbackTasks) { _callbackTasks.Enqueue(task); } task.Wait(); tcs.Task.Wait(); var responce = new RpcString("1"); Debug.Log("Finished"); return responce.Handle; } void Start() { controller = FindFirstObjectByType(); CrpcTestApi.crpc_test_init(); CrpcTestExtensions.CrpcTestAddMethod(RpcStringCallback, "test_method"); Debug.Log("[RpcTest] Initialized and method added"); } private void Update() { lock (_callbackTasks) { while (_callbackTasks.Count > 0) { var task = _callbackTasks.Dequeue(); task.RunSynchronously(); Debug.Log("Update"); } } } private void OnDestroy() { Debug.Log("Call deinit1"); lock (_callbackTasks) { Debug.Log("Call deinit2"); _callbackTasks.Clear(); } Debug.Log("Call deinit finnaly"); CrpcTestApi.crpc_test_deinit(); } }