下面是详细讲解C#使用CancellationTokenSource取消Task的方法的完整攻略:
什么是CancellationTokenSource
CancellationTokenSource
是一个C#中的类,它用于取消一个或多个CancellationToken
实例。可以将其视为控制任务执行过程的信号灯。当在CancellationTokenSource的实例上调用Cancel()
方法时,会捕获到一个取消标志并通知所有已注册的CancellationToken对象。
如何使用CancellationTokenSource
创建CancellationTokenSource
在代码中创建一个CancellationTokenSource
实例的方式非常简单:
var tokenSource = new CancellationTokenSource();
创建CancellationToken
接下来,将该CancellationTokenSource
实例作为参数来创建CancellationToken
对象。这个CancellationToken
对象可以交给异步任务,用来控制任务的执行过程。
CancellationToken token = tokenSource.Token;
注册取消操作
在代码中,可以注册一个或多个取消操作。例如,在以下代码中,当用户按下“Cancel”按钮时,tokenSource.Cancel()
将被调用,以使任务的执行中止。
cancelButton.Click += (s, e) =>
{
tokenSource.Cancel();
};
在异步任务中使用CancellationToken
在某些情况下,异步任务可能需要访问取消标志。例如,在以下代码中,异步任务在执行操作时检查取消标志:
async Task<int> FooAsync(CancellationToken token)
{
// Do some work here
for (int i = 0; i < 100; i++)
{
token.ThrowIfCancellationRequested();
await Task.Delay(1000, token);
}
// Do some more work here
return 42;
}
在这个例子中,token.ThrowIfCancellationRequested()
语句用于检查CancellationToken
。如果取消标志已经设置了,那么这个方法将抛出一个异常,以终止任务的执行。
传递CancellationToken给异步任务
异步方法可以通过将CancellationToken
传递给Task.Run()
方法来使用取消标志:
Task<int> task = Task.Run(() => FooAsync(token), token);
注意Task.Run()
方法接受第二个参数CancellationToken
。
等待异步任务结束或取消
如果异步任务正常结束,可以使用await
语句来等待结果。例如:
try
{
int result = await task;
Console.WriteLine($"Result: {result}");
}
catch (TaskCanceledException)
{
Console.WriteLine("Task was canceled");
}
如果任务被取消,应该在catch
块中处理TaskCanceledException
异常。
示例
以下示例演示如何使用CancellationTokenSource
和CancellationToken
来取消一个异步任务。
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
try
{
// Create the CancellationTokenSource and CancellationToken
var tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
// Register the Cancel button handler
cancelButton.Click += (s, e) =>
{
tokenSource.Cancel();
};
// Start the background task
Task<int> task = Task.Run(() => CountAsync(token), token);
// Wait for the task to complete or cancel
int result = await task;
// Update the UI with the result
resultLabel.Text = $"Result: {result}";
}
catch (TaskCanceledException)
{
resultLabel.Text = "Task was canceled";
}
}
private async Task<int> CountAsync(CancellationToken token)
{
int count = 0;
try
{
while (!token.IsCancellationRequested)
{
count++;
await Task.Delay(1000, token);
}
}
catch (TaskCanceledException)
{
// Task was canceled
}
return count;
}
这个例子显示了一个窗体,它包含一个名为“Start”的按钮和一个名为“Cancel”的按钮。单击“Start”按钮将启动一个异步任务,该任务将计数器增加到指定的数字。如果用户单击“Cancel”按钮,异步任务将被取消。如果异步任务正常结束,计数器的值将显示在窗口标题栏中。
总结
使用CancellationTokenSource
和CancellationToken
来取消异步任务是一种非常有用的技术。关键是了解如何创建和使用这些对象,并将其传递给异步方法,以便可以控制任务的执行。通过使用上面提供的示例,你应该能够更轻松地在C#中使用这些技术。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用CancellationTokenSource 取消 Task的方法 - Python技术站