Unity: правильный способ отмены и управления async / await и Task.Delay () в сборках IL2 CPP - PullRequest
0 голосов
/ 23 марта 2020

Следующий код работает правильно в редакторе, и Задача будет продолжаться до тех пор, пока не будет отменена с помощью 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...