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的一些基本信息。
我试图掌握如何创建用于取消任务的按钮。 这是我的代码,但它不会取消任务:
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的一些基本信息。