在Visual Basic (VB) 中实现多线程编程主要依赖于.NET Framework 提供的多线程支持。从.NET Framework 2.0开始,System.Threading 命名空间提供了多个类来支持多线程编程,其中最常用的是 Thread
类和 ThreadPool
类,以及从.NET Framework 4.0 开始引入的 Task
类和 Parallel
类,它们在.NET Framework 4.5中通过 async
和 await
关键字得到了进一步的支持,使异步编程更加简洁和直观。
使用 Thread 类
Thread
类允许你创建和控制线程。使用 Thread
类,你可以编写代码来创建新线程,然后在该线程上执行方法。
vb复制代码
Imports System.Threading | |
Module Module1 | |
Sub Main() | |
Dim t As New Thread(AddressOf ThreadWork) | |
t.Start() | |
Console.WriteLine("Main thread doing work...") | |
Console.ReadLine() | |
End Sub | |
Sub ThreadWork() | |
Console.WriteLine("Thread procedure starting.") | |
' 在这里执行线程的工作 | |
Thread.Sleep(2000) ' 模拟耗时操作 | |
Console.WriteLine("Thread procedure done.") | |
End Sub | |
End Module |
使用 ThreadPool 类
ThreadPool
类提供了一种线程池的实现,它允许你重用线程,而不是在每次需要时都创建新线程。这对于执行许多短时间的任务非常有用。
vb复制代码
Imports System.Threading | |
Module Module1 | |
Sub Main() | |
ThreadPool.QueueUserWorkItem(AddressOf ThreadPoolWork) | |
Console.WriteLine("Main thread continuing...") | |
Console.ReadLine() | |
End Sub | |
Sub ThreadPoolWork(state As Object) | |
Console.WriteLine("ThreadPool thread starting work.") | |
' 在这里执行线程的工作 | |
Thread.Sleep(2000) ' 模拟耗时操作 | |
Console.WriteLine("ThreadPool thread done.") | |
End Sub | |
End Module |
使用 Task 类
从.NET Framework 4.0开始,Task
类提供了一种更高级别、更易于使用的并行编程模型。使用 Task
类,你可以编写异步操作,这些操作可以并行执行,并且可以等待它们完成。
vb复制代码
Imports System.Threading.Tasks | |
Module Module1 | |
Async Sub Main() | |
Await Task.Run(Sub() TaskWork()) | |
Console.WriteLine("Main thread continuing...") | |
Console.ReadLine() | |
End Sub | |
Sub TaskWork() | |
Console.WriteLine("Task starting.") | |
' 在这里执行异步工作 | |
Task.Delay(2000).Wait() ' 模拟耗时操作 | |
Console.WriteLine("Task done.") | |
End Sub | |
End Module |
注意:在上面的 TaskWork
方法中,我使用了 Task.Delay(2000).Wait()
来模拟耗时操作,但这不是最佳实践,因为它会阻塞调用线程(在这个例子中是线程池中的线程)。更好的做法是使用 Await Task.Delay(2000)
,但这需要你将 TaskWork
方法标记为 Async
并将其签名更改为 Async Sub TaskWork()
或 Async Function TaskWork() As Task
,然后相应地调整调用方式。
使用 async 和 await
async
和 await
关键字提供了一种编写异步代码的方法,这些代码可以以类似于同步代码的方式编写,但它们会在后台异步执行。这使得异步编程变得更加简单和直观。
vb复制代码
Imports System.Threading.Tasks | |
Module Module1 | |
Async Sub Main() | |
Await LongRunningOperationAsync() | |
Console.WriteLine("Main thread continuing after LongRunningOperationAsync.") | |
Console.ReadLine() | |
End Sub | |
Async Function LongRunningOperationAsync() As Task | |
Console.WriteLine("Starting long-running operation.") | |
Await Task.Delay(2000) ' 模拟耗时操作 | |
Console.WriteLine("Long-running operation completed.") | |
End Function | |
End Module |
在上面的例子中,LongRunningOperationAsync
是一个异步方法,它使用 Await Task.Delay(2000)
来模拟耗时操作。Main
方法则使用 Await
关键字等待这个异步操作完成,而不会阻塞主线程。