C#如何创建一个按钮来取消休眠任务?

C# How create a button to cancel sleeping Task?

我试图掌握如何创建用于取消任务的按钮。 这是我的代码,但它不会取消任务:

 public partial class MainWindow : Window
{
    CancellationTokenSource CTS;
    CancellationToken CT;

    public MainWindow()
    {
        InitializeComponent();
        CTS = new CancellationTokenSource();
        CT = CTS.Token;
        btnCancel.Click += btnCancelling;
        btnDoWork.Click += btnDoingWork;
    }

    private void btnCancelling (object sender, RoutedEventArgs e)
    {
        CTS.Cancel();
    }

    private void btnDoingWork (object sender, RoutedEventArgs e)
    {
        try
        {
            DoWork (CT);
        } catch (AggregateException ae)
        {
            foreach (var inner in ae.InnerExceptions)
            {
                if (inner is TaskCanceledException)
                {
                    MessageBox.Show("The task was cancelled.");
                }
                else
                {
                    throw;
                }
            }
        }


    }


    private void DoWork (CancellationToken CT)
    {
        Task task = new Task(() =>
          {
                  Thread.Sleep(5000);
                  MessageBox.Show("WorkIsDone");
                  CT.ThrowIfCancellationRequested();          
          }, CT);
        task.Start();
    } 
}

DoWork() 方法工作正常,它在休眠 5 秒后显示一条消息 "work is done"。

我在 Whosebug 上认真阅读了其他类似主题,但它们是关于从 Main() 方法调用 Cancel() 的,但是如何创建一个特殊按钮来完成这项工作?

我应该如何修改我的代码以在休眠期间取消 DoWork() 方法?

在这 5 秒的睡眠期间,您将无法取消任务。取消只会在 ThrowIfCancellationRequested() 调用时发生,并且只有在已经进行了 CTS.Cancel() 调用时才会发生。

您的任务代码是需要停止工作并不时检查令牌以取消的任务代码。

您似乎对取消的运作方式感到困惑。 Here的一些基本信息。