Как отключить Firebase Task в Unity - PullRequest
0 голосов
/ 03 мая 2020

Эта проблема сводит меня с ума :) Предполагая, что у меня есть простой asyn c Задача:

async Task AddPoints()
{


    await usersDbReference.Child(currentUser).Child("Score").SetValueAsync(newScore).ContinueWith(task =>
    {
        if(task.IsFaulted || task.IsCanceled)
        {
            Debug.Log("Couldn't complete task");
        }
    });

}

Какой самый простой способ добавить время ожидания, например, 10 секунд, после чего я появится всплывающее окно для пользователя, чтобы проверить его / ее rnet соединение?

Заранее спасибо!

РЕДАКТИРОВАТЬ: я попробовал код ниже, но это делает единство cra sh :

int timeout = 1000;
var task = SomeOperationAsync();
if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
    // task completed within timeout
} else { 
    // timeout logic
}

Я использую Unity (уровень совместимости API. Net Стандарт 2.0, я предполагаю, что cra sh из-за этого?)

Чего я хочу достичь : В случае, если у пользователя нет соединения inte rnet, я хочу либо приостановить задание и отменить его, либо просто отменить его после обнаружения отсутствия соединения inte rnet.

EDIT:

Я изменил код. Итак, у меня есть простое задание с токеном отмены:

async Task CheckTask(CancellationToken csToken)
{

    string firstChild = "user";
    string secondChild = "testuser";

    await FirebaseDatabase.DefaultInstance.RootReference.Child(firstChild).Child(secondChild).GetValueAsync().ContinueWith(task =>
    {
        if(task.IsFaulted || task.IsCanceled)
        {
            Debug.Log("Task was canceled");
        }
    });
}

Затем я вызываю его из asyn c void:

public async void FirebaseLogin()
{
    bool taskDidntComplete = false;

    Debug.Log("Started task");

    CancellationTokenSource cs = new CancellationTokenSource();

    try
    {
        var loginTask = CheckTask(cs.Token);

        if(loginTask.IsCanceled)
        {
            Debug.Log("Canceled");
        }

        if (await Task.WhenAny(loginTask, Task.Delay(10000)) == loginTask) 
        {
            taskDidntComplete = false;
        } 
        else 
        { 
            taskDidntComplete = true;
            Debug.Log(taskDidntComplete);
            cs.Cancel();
            throw new TimeoutException();
        }
    }
    catch (Exception e)
    {
        Debug.Log(e);
    }
    finally
    {
    }
}

И пока все работает нормально и показывает исключение, это не отменяет задачу. Буду очень признателен, если кто-нибудь скажет мне, что я делаю неправильно.

EDIT2: Отлично работает в Unity, не работает на Android ... Кто-нибудь может помочь? Теперь я в отчаянии, ха-ха

public async void FirebaseLogin()
{

    Debug.Log("Started task");

    CancellationTokenSource cs = new CancellationTokenSource();

    try
    {
        var loginTask = CheckTask(cs.Token);

        if(loginTask.IsCanceled)
        {
            Debug.Log("Canceled");
            netTestCheck.text = "Canceled";
        }

        if (await Task.WhenAny(loginTask, Task.Delay(10000)) == loginTask) 
        {
            //netTestCheck.text = "Completed";
        } 
        else 
        { 
            netTestCheck.text = "Failed";
            cs.Cancel(false);
            //throw new TimeoutException();
        }

        cs.Token.ThrowIfCancellationRequested();
    }
    catch (Exception e)
    {
        netTestCheck.text = "Failed2";
        Debug.Log(e);
    }
    finally
    {

    }

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

К сожалению, он не будет работать на Android, потому что приложение будет продолжать звонить в Firebase. К счастью нашел дорогу: D

0 голосов
/ 04 мая 2020

Было бы полезно, если бы вы могли поделиться исключением или трассировкой стека cra sh ( интеграция Crashlytics может помочь, если вы уже находитесь в экосистеме Firebase).

Хотя Я не могу шпионить за тем, что выглядит особенно плохо в вашем примере кода, если фактический Task не удался по какой-либо причине (скажем, вы включаете режим полета, чтобы проверить, и подходящее исключение поднимается до истечения времени ожидания), исключение будет возбуждено там, с которыми вы не справляетесь.

Я бы посоветовал сделать попытку / поймать вокруг вашего блока, например:

try {
    int timeout = 1000;
    var task = SomeOperationAsync();
    if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
        // task completed within timeout
    } else { 
        // timeout logic
    }
} catch (Exception e) {
    Debug.LogError($"{e} occurred!");
}

Вероятно, это будет DatabaseException , но я бы сначала проверил, прежде чем вы получите больше конкретных c, чем Exception.

Дайте мне знать, если это поможет!

- Патрик

...