在我使用之前
protected async void OnResume() {
await DoWorkAsync(); // assume exception is appropriately handled
await DoOtherWorkAsync();
}但现在我看到其他开发人员使用
protected void OnResume() {
SynchronizationContext.Current.Post(async (status) => {
await DoWorkAsync();
await DoOtherWorkAsync();}, null);
}在非异步方法中调用异步方法时,第二个方法是否正确和首选?提前谢谢你。
更新:如果您使用第二个片段,您必须在UI线程上调用SynchronizationContext.Current.Post(),否则您将得到NullReferenceException,因为SynchronizationContext.Current在非UI线程上为null。只要在UI线程上实例化_handler.Post(async() => {// do UI changes});,就可以在非UI线程上调用_handler来进行任何UI更改。
发布于 2015-11-02 15:46:42
不,不要用SynchronizationContext。您已经进入了UI线程,因此第二个选项实际上是没有意义的。
注意,通常应该避免使用async void。在本例中,我认为这是可以接受的,因为实际上您将OnResume当作一个事件处理程序对待:
protected async void OnResume()
{
await DoWorkAsync();
}发布于 2015-11-02 15:44:38
这两个例子都在执行不必要的工作。该方法的最佳实施将是:
protected void OnResume()
{
DoWorkAsync();
}在第一种情况下,您强迫一个延续在当前上下文中运行,但该延续实际上没有什么可做的;它只是毫无意义地向同步上下文添加一个post。
第二个片段是添加两个无意义的帖子,两个是当前的同步上下文,一个是显式的,另一个是隐式的。
这两种方法都有添加状态机的async方法,即使您实际上没有利用其中的任何功能,所以这些开销都是完全浪费的。
https://stackoverflow.com/questions/33481047
复制相似问题