В ожидании получения данных

Рейтинг: 1Ответов: 1Опубликовано: 01.07.2023

Есть у модели метод авторизации

В нём ввод логина, ввод пароля и ещё ввод кода из смс

Вот по среди выполненеия метода, нужно получить код смс от пользователя.

Я обычно все ожидания делал тупо через while - опрашивая свойство c определённой задержкой

public string SmsCode { get; set;}

while(SmsCode == null)
{
    await Task.Delay(500);
}

А как можно ещё поступить более правильно ?

Ответы

▲ 2Принят

Можно через колбэк и TaskCompletionSource.

private TaskCompletionSource _tcs;

private void OnSmsCodeReceived()
{
    if (_tcs is null)
        return;

    _tcs.SetResult();
    _tcs = null;
}

private Task WaitForSmsCodeAsync()
{
    if (_tcs is null)
        _tcs = new();
       
    return _tcs.Task;
}

Свойство получится такое

private string _smsCode;

public string SmsCode
{
    get => _smsCode;
    set
    {
        _smsCode = value;
        if (value is not null)
            OnSmsCodeReceived();
    }
}

А ожидание такое

await WaitForSmsCodeAsync();

Единственное, что здесь может пойти теоретически не так, это если код придёт раньше, чем вы начали ожидание. Но подозреваю, что это в реальной жизни невозможно.

Идея, я думаю, ясна. Но вероятно можно завернуть подобным образом методы запроса кода. Чтобы сама операция асинхронно возвращала код, а не свойство мониторить. Хотя, с помощью TaskCompletionSource можно что угодно превратить в ожидаемое через await.