如何在不阻止 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。 而不是实际阻止 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。