Max Barashev f863b8b6ca Fixed Main Thread freezing on heavy tasks
- Main thread unfreezing solution-TaskCompletionSource added in RpcTest.cs
 - Updated BlendShaderController to hold TaskCompletionSource
2026-05-20 14:31:23 +03:00

74 lines
1.9 KiB
C#

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<Task> _callbackTasks = new Queue<Task>();
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<bool>();
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<BlendShaderController>();
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();
}
}