如何在不阻止 UI 的情况下暂停
本文关键字:UI 情况下 暂停 | 更新日期: 2023-09-27 18:34:12
我有一个点击事件,一旦点击按钮,手机就会振动。这通常效果很好,除了有时振动不会停止,直到我完全关闭应用程序。我想给应用程序时间来完成它的振动,然后继续使用该方法的其余部分,但我根本不想阻止 UI。我该如何做到这一点
主页.xaml.cs
void newButton_Click(object sender, EventArgs e)
{
//Button vibration
if (Settings.EnableVibration.Value) //boolean flag to tell whether to vibrate or not
{
VibrateController.Default.Start(TimeSpan.FromMilliseconds(100));
//place vibration stop here?
}
this.NavigationService.Navigate(new uri("/NewPage.xaml", UriKind.Relate));
}
我已经尝试过 VibrationController.Default.Stop(); 但这完全消除了振动。有没有办法简单地等到振动完成后再导航到新页面,或者执行该方法应执行的任何其他操作?对此实施或其他建议有什么建议或建议吗?
可以使用异步来防止阻止 UI。 而不是实际阻止 UI 线程,您需要安排一个操作从现在起 100 毫秒后再次发生。 向Task.Delay
调用添加延续可以做到这一点:
void newButton_Click(object sender, EventArgs e)
{
Action navigate = () =>
this.NavigationService.Navigate(new uri("/NewPage.xaml", UriKind.Relate));
if (Settings.EnableVibration.Value) //boolean flag to tell whether to vibrate or not
{
VibrateController.Default.Start();
Task.Delay(100).ContinueWith(t =>
{
VibrationController.Default.Stop();
navigate();
});
}
else
navigate();
}
.NET 将此功能方便地包装在 BackgroundWorker
类中。
private void SomeMethod()
{
// Create backgroundworker
BackgroundWorker bw = new BackgroundWorker();
// Attach event handler
bw.DoWork += bw_DoWork;
// Run Worker
bw.RunWorkerAsync();
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
// Do background stuff here
}
它还支持进度更新并在完成时触发事件,据我所知,此功能扩展到Windows Phone。MSDN 文章中介绍了所有这些内容。
我猜你想做的是在后台工作线程中调用振动,你可以侦听RunWorkerCompletedEvent,该事件将在完成后触发。此外,您可以愉快地暂停此"线程",它不会干扰 UI。