[Windows翻译]Windows Runtime异步操作能否保证完成?

185 阅读2分钟

原文地址:devblogs.microsoft.com/oldnewthing…

原文作者:devblogs.microsoft.com/oldnewthing…

发布时间:2020年3月27日

Windows Runtime使用异步操作,即立即开始并返回的操作,当操作完成后再通知你。这让你在等待操作的同时还可以做其他事情。现在大多数编程语言都内置了对这种编程风格的支持,通常是通过使用关键字 await 的某种变体。

是否能保证Windows Runtime操作最终会完成?

任何操作都能保证最终完成吗?

其实不然。

例如,你可能通过调用MessageBox.ShowAsync向用户显示一个对话框。当用户对对话框做出响应时,这个操作就完成了。但如果用户不在那里呢?对话框就会无限期地留在屏幕上。现在,用户有可能在某一天返回,所以你可能会说这个操作还没有完全卡住,因为用户可以随时通过响应对话框来解除卡住。

AnimatedVisualPlayer.PlayAsync方法在动画停止时完成。如果你要求动画播放到最后并停止,那么这种情况就会自然发生,但是如果你要求动画循环播放,那么直到你手动调用Stop来停止它,它才会停止。这是否意味着不能保证PlayAsync会永远完成?我的意思是,你的程序总是可以通过调用Stop来解除它。

每个异步操作都定义了它将完成的条件。如果这些条件从未被满足,那么它将永远不会完成。异步操作在这里没有什么特别之处。这种情况也可以发生在同步函数中。如果你要求WaitForSingleObject等待一个永远不会有信号的句柄,那么它将永远不会返回。

额外的唠叨。你可以很容易地创建你自己的Windows Runtime异步操作,它永远不会完成。

winrt::IAsyncAction HangAsync()
{
    co_await std::experimental::suspend_always{};
}

suspend_always对象悬空,永远不会被唤醒。等待它将永远不会完成。而这意味着你从它身上创建的 IAsyncAction 将永远不会完成。