Эта проблема сводит меня с ума :) Предполагая, что у меня есть простой 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
{
}