Xzizz Asked:2023-07-01 23:35:32 +0800 CST2023-07-01 23:35:32 +0800 CST 2023-07-01 23:35:32 +0800 CST 等待数据 772 该模型有授权方法 它包含登录名、密码和短信中的另一个代码 这里,在该方法的执行中,您需要接收来自用户的短信代码。 while我通常通过延迟轮询属性来愚蠢地完成所有等待 public string SmsCode { get; set;} while(SmsCode == null) { await Task.Delay(500); } 你还能怎样做得更好? c# 1 个回答 Voted Best Answer aepot 2023-07-02T00:02:52+08:002023-07-02T00:02:52+08:00 可以通过回调 和 来实现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。
可以通过回调 和 来实现
TaskCompletionSource
。该属性将如下所示
期望是
从理论上讲,这里唯一可能出错的是代码是否在您开始等待之前到达。但我怀疑这在现实生活中是不可能的。
我认为这个想法很明确。但可能可以通过这种方式包装代码请求方法。以便操作本身异步返回代码,而不是监视器属性。尽管如此,在帮助下
TaskCompletionSource
您可以通过 . 将任何事情变成预期的结果await
。