在 Unity 中使用 ET 框架时,确实无法使用'async void'来捕捉异常。但是可以使用 AsyncTaskMethodBuilder 来解决这个问题。

首先,需要使用 AsyncTaskMethodBuilder 创建一个异步任务方法,然后在方法中使用 try-catch 语句块来捕捉异常,并使用 AsyncTaskMethodBuilder.SetException 方法将异常传递给任务方法。最后,使用 AsyncTaskMethodBuilder.Create 方法来创建一个异步任务方法。

下面是一个示例代码:

public static class UnityAsyncExtensions
{
    public static UnityAsyncTask RunAsync(this MonoBehaviour behaviour, Func<Task> taskFunction)
    {
        var taskBuilder = AsyncTaskMethodBuilder.Create();
        var unityAsyncTask = new UnityAsyncTask(taskBuilder);

        behaviour.StartCoroutine(unityAsyncTask.Run(taskFunction));

        return unityAsyncTask;
    }

    public class UnityAsyncTask
    {
        private AsyncTaskMethodBuilder taskBuilder;

        public UnityAsyncTask(AsyncTaskMethodBuilder taskBuilder)
        {
            this.taskBuilder = taskBuilder;
        }

        public IEnumerator Run(Func<Task> taskFunction)
        {
            try
            {
                await taskFunction();
                taskBuilder.SetResult();
            }
            catch (Exception ex)
            {
                taskBuilder.SetException(ex);
            }

            yield return null;
        }

        public void AwaitOnCompleted(Action action)
        {
            taskBuilder.AwaitOnCompleted(action);
        }

        public void SetStateMachine(IAsyncStateMachine stateMachine)
        {
            taskBuilder.SetStateMachine(stateMachine);
        }
    }
}

然后,在 Unity 中可以使用以下方式来调用异步方法:

private UnityAsyncExtensions.UnityAsyncTask unityAsyncTask;

private void Start()
{
    unityAsyncTask = this.RunAsync(MyAsyncMethod);
}

private async Task MyAsyncMethod()
{
    // 异步操作代码
    await Task.Delay(1000);

    // 抛出异常
    throw new Exception('Some error occurred.');
}

private void Update()
{
    // 检查异步任务是否完成
    if (unityAsyncTask != null && unityAsyncTask.IsCompleted)
    {
        if (unityAsyncTask.IsFaulted)
        {
            // 异常处理
            Debug.LogError(unityAsyncTask.Exception);
        }
        else
        {
            // 异步任务完成
            Debug.Log('Async task completed successfully.');
        }

        unityAsyncTask = null;
    }
}

上述示例代码中的 UnityAsyncExtensions 类定义了 RunAsync 扩展方法,该方法接受 Func 委托作为参数,并返回一个 UnityAsyncTask 对象。在 Start 方法中使用 RunAsync 方法调用异步方法 MyAsyncMethod。在 Update 方法中检查异步任务是否完成,并进行相应的处理。

希望这可以帮助到你!

Unity ET框架 Async void 异常捕获:使用 AsyncTaskMethodBuilder 解决

原文地址: http://www.cveoy.top/t/topic/o9Qh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录