如何让数组内的类实例独立运行?VB.NET代码问题求助
问题分析与解决方案
问题根源
你的代码卡死是因为所有逻辑都在UI单线程执行:
- 在循环创建
my_class实例时,调用mc.process()会立刻进入死循环,此时global_variable还没被设置为536,且后续设置global_variable的代码完全没机会运行,UI线程被彻底阻塞,程序自然冻结。
修复方案
要让代码正常运行,必须让每个my_class的process方法在后台线程执行,避免阻塞UI线程;同时对全局变量counter的修改做线程安全处理,防止多线程竞争问题。
修改后的完整代码
模块部分
Module Module1 Public global_variable As Integer Public array(156) As my_class Public counter As Integer ' 用于同步counter的线程锁 Private counterLock As New Object() End Module
类部分
Public Class my_class Public Sub process() ' 在后台线程执行循环逻辑 Threading.ThreadPool.QueueUserWorkItem(Sub() Do If global_variable = 536 Then ' 线程安全地修改counter SyncLock Module1.counterLock Module1.counter += 1 End SyncLock Exit Do End If ' 短暂休眠,减少CPU占用 Threading.Thread.Sleep(10) Loop End Sub) End Sub End Class
窗体部分
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Static casual As New Random Dim mynumber, k As Integer ' 重置全局状态,避免多次点击按钮出现异常 Module1.global_variable = 0 Module1.counter = 0 For k = 0 To 156 Dim mc As New my_class array(k) = mc mc.process() ' 现在会在后台启动线程,不会阻塞UI Next MessageBox.Show("所有实例已启动后台检查!") Do mynumber = casual.Next(0, 2001) global_variable = mynumber ' 短暂休眠,避免循环占用过高CPU Threading.Thread.Sleep(10) If counter = 157 Then Exit Do Loop MessageBox.Show("主循环已退出!") End Sub End Class
关键修改说明
- 多线程执行:使用
ThreadPool.QueueUserWorkItem让每个process的循环在后台线程运行,UI线程不会被阻塞,后续设置global_variable的代码能正常执行。 - 线程安全:用
SyncLock保护counter的修改,防止多个线程同时修改导致计数错误。 - CPU优化:添加
Thread.Sleep(10)减少空循环的CPU占用,避免程序过度消耗资源。
内容的提问来源于stack exchange,提问作者Fabrizio Nitro
相关产品推荐
相关产品推荐

