Следующий код работает правильно в редакторе, и Задача будет продолжаться до тех пор, пока не будет отменена с помощью cancellationTokenSource.Cancel ();
Однако при сборке для iOS (IL2 CPP) приложение не будет продолжено внутри блока catch и останавливается на: await Task.Delay (1000);
l oop просто не продолжается на устройстве.
using System;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
public class AsyncTest : MonoBehaviour {
static CancellationTokenSource cancellationTokenSource = new CancellationTokenSource ();
void Start () {
Initialize ();
}
void OnDestroy () {
cancellationTokenSource.Cancel ();
}
async void Initialize () {
await ConnectAsync ();
}
async Task ConnectAsync () {
Debug.Log ("Connecting");
while (!cancellationTokenSource.IsCancellationRequested) {
try {
throw new ApplicationException ("Cannot connect");
}
catch when (cancellationTokenSource.IsCancellationRequested) {
Debug.Log ("Cancelling...");
return;
}
catch (Exception ex) {
Debug.Log (ex.Message);
await Task.Delay (1000);
}
}
}
public async void Connect () {
cancellationTokenSource = new CancellationTokenSource ();
await ConnectAsync ();
}
public void Cancel () {
cancellationTokenSource.Cancel ();
}
}
Консоль XCode:
ApplicationException: Cannot connect
at AsyncTest..cctor () [0x00000] in <00000000000000000000000000000000>:0
at System.Linq.Expressions.StackGuard.RunOnEmptyStack[T1,T2] (System.Action`2[T1,T2] action, T1 arg1, T2 arg2) [0x00000] in <00000000000000000000000000000000>:0
at AsyncTest.Connect () [0x00000] in <00000000000000000000000000000000>:0
at AsyncTest..cctor () [0x00000] in <00000000000000000000000000000000>:0
at System.Linq.Expressions.StackGuard.RunOnEmptyStack[T1,T2] (System.Action`2[T1,T2] action, T1 arg1, T2 arg2) [0x00000] in <00000000000000000000000000000000>:0
at AsyncTest.Initialize () [0x00000] in <00000000000000000000000000000000>:0
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <00000000000000000000000000000000>:0
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00000] in <00000000000000000000000000000000>:0
at AsyncTest..cctor () [0x00000] in <00000000000000000000000000000000>:0
at System.Linq.Expressions.StackGuard.RunOnEmptyStack[T1,T2] (System.Action`2[T1,T2] action, T1 arg1, T2 arg2) [0x00000] in <00000000000000000000000000000000>:0
at AsyncTest.Initialize () [0x00000] in <00000000000000000000000000000000>:0
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <00000000000000000000000000000000>:0
at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in <00000000000000000000000000000000>:0
at System.Threading.SendOrPostCallback.Invoke (System.Object state) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.UnitySynchronizationContext.Exec () [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.UnitySynchronizationContext.Exec () [0x00000] in <00000000000000000000000000000000>:0
UnityEngine.UnitySynchronizationContext:Exec()
UnityEngine.UnitySynchronizationContext:Exec()