在 VB.NET 中,多线程可以使用以下机制:
Thread (System.Threading.Thread) — 手动创建和启动线程。需要详细管理,适合简单场景。BackgroundWorker — 便于在 Windows Forms 应用程序中进行异步操作(UI 保持响应)。Task Parallel Library (TPL),包括类 Task 和关键字 Async/Await。现代且推荐的方法。同步:
SyncLock)、互斥锁、信号量 — 用于保护关键区域和访问共享资源。示例:
' 启动并行任务 Imports System.Threading.Tasks Sub StartJob() Task.Run(Sub() ' 长时间操作 Console.WriteLine("在单独的线程中工作") End Sub) End Sub ' 使用 SyncLock 进行同步 Dim locker As New Object() Sub SafeIncrement() SyncLock locker ' 此处代码原子执行 End SyncLock End Sub
是否可以在任何线程中自由访问 Windows Forms 控件?为什么/为什么不?
答案:
不,WinForms 控件只能从创建它们的线程(通常是主 UI 线程)访问。违反这一点会导致不可预测的错误或崩溃。为了从其他线程更新 UI,需要使用 Invoke 或 BeginInvoke 方法。
示例:
If TextBox1.InvokeRequired Then TextBox1.Invoke(Sub() TextBox1.Text = "来自线程的数据" End Sub) Else TextBox1.Text = "来自线程的数据" End If
故事
在服务器应用程序中,处理共享列表时未使用任何同步机制。结果 — 不时出现 InvalidOperationException 异常和“数据崩溃”。
故事
在 Windows 应用程序中,通过 BackgroundWorker 从后台线程更新控件。应用程序有时会“崩溃”而没有明显的错误消息 — 原因:在不安全的线程访问中直接修改 UI。
故事
程序员启动了多个线程,每个线程在没有 SyncLock 的情况下更改全局变量。结果 — 数据竞争、不正确的计算结果、难以捕捉的 bug 和频繁的报告崩溃。