VB.NET语言 异步操作取消 CancellationToken ?

VB.NET阿木 发布于 2025-05-28 7 次阅读


阿木博主一句话概括:深入探讨VB.NET中的异步操作取消(CancellationToken)

阿木博主为你简单介绍:
在VB.NET中,异步操作是提高应用程序响应性和性能的关键技术。而CancellationToken类则为异步操作提供了取消机制,使得开发者能够在需要时优雅地终止异步任务。本文将深入探讨VB.NET中的CancellationToken,包括其基本用法、高级特性以及在实际开发中的应用。

一、
随着现代应用程序对性能和响应性的要求越来越高,异步编程成为了提高应用程序效率的重要手段。在VB.NET中,CancellationToken类为异步操作提供了取消机制,使得开发者可以在异步任务执行过程中随时取消操作,从而避免不必要的资源浪费。

二、CancellationToken基本用法
CancellationToken类是System.Threading命名空间中的一个结构体,它包含一个布尔值,用于表示是否取消异步操作。以下是一个简单的示例,展示了如何使用CancellationToken来取消异步操作:

vb.net
Imports System.Threading
Imports System.Threading.Tasks

Module Module1
Sub Main()
Dim cancellationTokenSource As CancellationTokenSource = New CancellationTokenSource()
Dim cancellationToken As CancellationToken = cancellationTokenSource.Token

Task.Run(Sub()
Try
For i As Integer = 1 To 10
Console.WriteLine($"Iteration {i}")
Thread.Sleep(1000)
cancellationToken.ThrowIfCancellationRequested()
Next
Catch ex As OperationCanceledException
Console.WriteLine("Operation was canceled.")
End Try
End Sub, cancellationToken)

Console.WriteLine("Press any key to cancel the operation...")
Console.ReadKey()

cancellationTokenSource.Cancel()
End Sub
End Module

在上面的代码中,我们创建了一个CancellationTokenSource对象,并从中获取了CancellationToken。然后,我们使用Task.Run方法启动了一个异步任务,该任务在每次迭代中都会检查CancellationToken是否被请求取消。如果被取消,则会抛出OperationCanceledException异常。

三、CancellationToken高级特性
1. CancellationTokenSource链式操作
CancellationTokenSource类提供了多个方法,如Cancel、CancelAfter等,可以方便地进行链式操作。以下是一个示例:

vb.net
Imports System.Threading
Imports System.Threading.Tasks

Module Module1
Sub Main()
Dim cancellationTokenSource As CancellationTokenSource = New CancellationTokenSource()
Dim cancellationToken As CancellationToken = cancellationTokenSource.Token

cancellationTokenSource.CancelAfter(5000) ' 5秒后自动取消

Task.Run(Sub()
Try
For i As Integer = 1 To 10
Console.WriteLine($"Iteration {i}")
Thread.Sleep(1000)
cancellationToken.ThrowIfCancellationRequested()
Next
Catch ex As OperationCanceledException
Console.WriteLine("Operation was canceled.")
End Try
End Sub, cancellationToken)

Console.WriteLine("Press any key to cancel the operation...")
Console.ReadKey()
End Sub
End Module

在上面的代码中,我们使用CancelAfter方法设置了一个5秒后自动取消的定时器。

2. CancellationTokenRegistration
CancellationTokenRegistration类表示对CancellationToken的注册,可以用于取消操作。以下是一个示例:

vb.net
Imports System.Threading
Imports System.Threading.Tasks

Module Module1
Sub Main()
Dim cancellationTokenSource As CancellationTokenSource = New CancellationTokenSource()
Dim cancellationToken As CancellationToken = cancellationTokenSource.Token
Dim registration As CancellationTokenRegistration = cancellationTokenSource.Register()

Task.Run(Sub()
Try
For i As Integer = 1 To 10
Console.WriteLine($"Iteration {i}")
Thread.Sleep(1000)
cancellationToken.ThrowIfCancellationRequested()
Next
Catch ex As OperationCanceledException
Console.WriteLine("Operation was canceled.")
End Try
End Sub, cancellationToken)

Console.WriteLine("Press any key to cancel the operation...")
Console.ReadKey()

registration.Dispose() ' 取消注册
End Sub
End Module

在上面的代码中,我们使用Register方法注册了一个CancellationToken,并在需要取消操作时调用Dispose方法进行取消。

四、CancellationToken在实际开发中的应用
1. 异步Web请求
在异步Web请求中,CancellationToken可以用于取消长时间运行的请求,避免不必要的资源浪费。以下是一个示例:

vb.net
Imports System.Net.Http
Imports System.Threading.Tasks

Module Module1
Sub Main()
Dim cancellationTokenSource As CancellationTokenSource = New CancellationTokenSource()
Dim cancellationToken As CancellationToken = cancellationTokenSource.Token

Dim client As HttpClient = New HttpClient()
Dim task As Task = client.GetStringAsync("http://example.com", cancellationToken)

Console.WriteLine("Press any key to cancel the request...")
Console.ReadKey()

cancellationTokenSource.Cancel()
task.Wait()
End Sub
End Module

在上面的代码中,我们使用HttpClient类发起了一个异步Web请求,并通过CancellationTokenSource来取消请求。

2. 异步数据处理
在异步数据处理中,CancellationToken可以用于取消长时间运行的数据处理任务,避免不必要的资源浪费。以下是一个示例:

vb.net
Imports System.Threading
Imports System.Threading.Tasks

Module Module1
Sub Main()
Dim cancellationTokenSource As CancellationTokenSource = New CancellationTokenSource()
Dim cancellationToken As CancellationToken = cancellationTokenSource.Token

Task.Run(Sub()
Try
For i As Integer = 1 To 10
Console.WriteLine($"Processing data {i}")
Thread.Sleep(1000)
cancellationToken.ThrowIfCancellationRequested()
Next
Catch ex As OperationCanceledException
Console.WriteLine("Data processing was canceled.")
End Try
End Sub, cancellationToken)

Console.WriteLine("Press any key to cancel the data processing...")
Console.ReadKey()

cancellationTokenSource.Cancel()
End Sub
End Module

在上面的代码中,我们使用CancellationToken来取消异步数据处理任务。

五、总结
CancellationToken是VB.NET中异步编程的重要工具,它为异步操作提供了取消机制,使得开发者可以在需要时优雅地终止异步任务。本文深入探讨了CancellationToken的基本用法、高级特性以及在实际开发中的应用,希望对读者有所帮助。