如何在不阻止UI的情况下暂停

我有一个点击事件,一旦点击一个按钮,手机会振动。 这通常很有效,除非有时振动不会停止,直到我完全关闭应用程序。 我想给应用程序一些时间来完成它的振动,然后继续使用方法的其余部分,但我根本不想阻止UI。 我怎么能做到这一点

MainPage.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线程,您需要安排一个动作从现在起100ms再次发生。 将连续添加到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类中方便地包装了这个function。

 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 } 

它还支持进度更新并触发完成事件,据我所知,此function扩展到Windows Phone。 所有这些都包含在MSDN文章中。

我想你想要做的是在BackgroundWorker中调用vibrate,你可以监听RunWorkerCompletedEvent,它将在完成时触发。 此外,您可以愉快地暂停此“线程”,它不会干扰UI。