В ожидании получения данных
Есть у модели метод авторизации
В нём ввод логина, ввод пароля и ещё ввод кода из смс
Вот по среди выполненеия метода, нужно получить код смс от пользователя.
Я обычно все ожидания делал тупо через while - опрашивая свойство c определённой задержкой
public string SmsCode { get; set;}
while(SmsCode == null)
{
await Task.Delay(500);
}
А как можно ещё поступить более правильно ?
Ответы (1 шт):
Можно через колбэк и 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.