Unity ET框架 Async void 异常捕获:使用 AsyncTaskMethodBuilder 解决
在 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
希望这可以帮助到你!
原文地址: http://www.cveoy.top/t/topic/o9Qh 著作权归作者所有。请勿转载和采集!