Можно через колбэк и 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
.