如何取消任务?

Posted

技术标签:

【中文标题】如何取消任务?【英文标题】:How to cancel the task? 【发布时间】:2016-12-27 08:44:52 【问题描述】:

我在我的应用程序中覆盖 BackButton 并显示 MessageDialog。

 public Scenario_3()
    
        this.InitializeComponent();
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    


private async void HardwareButtons_BackPresseed(object sender, BackPressedEventArgs e)
    
        e.Handled = true;
        var dialog = new MessageDialog("Do you want exit?");

        dialog.Commands.Add(new Windows.UI.Popups.UICommand("yes")  Id = 0 );
        dialog.Commands.Add(new Windows.UI.Popups.UICommand("no")  Id = 1 );

        dialog.DefaultCommandIndex = 0;
        dialog.CancelCommandIndex = 1;

        var result = await dialog.ShowAsync();

        if (result.Label == "yes")
        
            this.Frame.Navigate(typeof(BlankPage1));

            ((Frame)Window.Current.Content).BackStack.Clear();
        

导航到 BlankPage1 后,如果按下 BackButton,我会再次看到 MessageDialog。 导航后如何取消此覆盖?

【问题讨论】:

如果没有好的minimal reproducible example 和更清晰的问题陈述,您的问题很难理解。但是,当您离开当前页面时,您似乎忘记了取消订阅 BackPressed 事件。 您是否尝试过例如使用 flag 来检查您的按钮/方法是否曾被调用过? 彼得·杜尼霍,谢谢!您的建议解决了这个问题。 如果@Romasz 可以将他的评论作为答案发布,您可以将其标记为答案,这样更多寻找解决方案的人可以快速找到一个好的答案。 @TomášHübelbauer 如果没有从 OP 获得更多信息,很难在这里写出一个好的答案 - 如果他使用宽应用程序返回事件或仅针对特定页面 + 更多详细信息。彼得的建议似乎也解决了 OP 的问题。 【参考方案1】:

根据您对我评论的回复,您似乎只是在离开该页面时忘记取消订阅BackPressed 事件。这样做将确保仅在需要时调用事件处理程序。

例如:

private async void HardwareButtons_BackPresseed(object sender, BackPressedEventArgs e)

    e.Handled = true;
    var dialog = new MessageDialog("Do you want exit?");

    dialog.Commands.Add(new Windows.UI.Popups.UICommand("yes")  Id = 0 );
    dialog.Commands.Add(new Windows.UI.Popups.UICommand("no")  Id = 1 );

    dialog.DefaultCommandIndex = 0;
    dialog.CancelCommandIndex = 1;

    var result = await dialog.ShowAsync();

    if (result.Label == "yes")
    
        // Leaving this page. Stop listening for Back button presses.
        Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtons_BackPressed;

        this.Frame.Navigate(typeof(BlankPage1));

        ((Frame)Window.Current.Content).BackStack.Clear();
    

【讨论】:

正确。即使您离开页面,它也会继续接收事件,直到它被 GCed。在NavigatedFrom 覆盖中取消订阅会更好,以防您以后添加代码以编程方式返回。

以上是关于如何取消任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何按任务名称检查和取消 Celery 任务

如何从另一个任务中取消 ScheduledFuture 任务并优雅地结束?

Flutter中如何取消任务

HttpClient - 任务被取消 - 如何获得确切的错误消息?

打印机如何取消打印任务

如何取消芹菜队列上的任务? [复制]