我想我对异步等待模型的理解一定漏掉了什么。本应简单的事情似乎难以实现。我有一个UI需要检查用户是否登录。要做到这一点,我需要调用我的类中的一个方法,它做一些查询。这个类反过来调用只有异步方法的第三方代码。我如何调用异步方法并让应用程序等待直到我得到结果呢?我已经尝试了所有建议的东西,如ConfigureAwait,RunSynchronous,.Result等。似乎没有什么可靠的工作。这似乎是如此愚蠢,像这样的事情是如此困难,所以我假设我错过了一个关键的信息。谢谢。
ConfigureAwait
RunSynchronous
.Result
sc4hvdpw1#
让我们把话说清楚:“让应用程序等到我得到结果?”与阻塞、等待或任何结果无关(我怎么强调都不为过)。如果你习惯于在完成某件事之前锁定UI,你应该切换你的设计,而不是试图找到一种方法来完成它。(我花了相当多的时间为Windows移动的编写MFC应用程序,我过去也经常这样做)处理这种情况的正确方法是让用户知道有工作正在进行(例如某种活动指示器),同时确保没有其他代码可以由于用户输入而执行(例如命令的CanExecute属性)。在适当的时候,您可以放置取消逻辑。更重要的是,在MAUI(以及一般的移动的开发)的环境中,阻塞UI线程,即使是几秒钟,也是完全不可接受的。它应该始终保持响应。这不是一个选择的问题。
igetnqfo2#
您可以在属性中使用Task.Result来阻止调用线程,直到任务完成。但是,在大多数情况下不建议这样做,因为这可能导致死锁。更好的方法是在标记为async的方法中使用await,这将导致该方法将控制返回给调用方法,直到等待的任务完成。如果需要阻止线程,等待任务时考虑使用ConfigureAwait(false)。有关异步/回调程序的同步错误处理的详细信息,请阅读this。
Task.Result
async
await
ConfigureAwait(false)
2条答案
按热度按时间sc4hvdpw1#
让我们把话说清楚:
“让应用程序等到我得到结果?”
与阻塞、等待或任何结果无关(我怎么强调都不为过)。
如果你习惯于在完成某件事之前锁定UI,你应该切换你的设计,而不是试图找到一种方法来完成它。(我花了相当多的时间为Windows移动的编写MFC应用程序,我过去也经常这样做)
处理这种情况的正确方法是让用户知道有工作正在进行(例如某种活动指示器),同时确保没有其他代码可以由于用户输入而执行(例如命令的CanExecute属性)。在适当的时候,您可以放置取消逻辑。
更重要的是,在MAUI(以及一般的移动的开发)的环境中,阻塞UI线程,即使是几秒钟,也是完全不可接受的。它应该始终保持响应。这不是一个选择的问题。
igetnqfo2#
您可以在属性中使用
Task.Result
来阻止调用线程,直到任务完成。但是,在大多数情况下不建议这样做,因为这可能导致死锁。更好的方法是在标记为async
的方法中使用await
,这将导致该方法将控制返回给调用方法,直到等待的任务完成。如果需要阻止线程,等待任务时考虑使用ConfigureAwait(false)
。有关异步/回调程序的同步错误处理的详细信息,请阅读this。