Vb.net 线程系统.NullReferenceException
我试图在选中或取消选中复选框时启动和停止自动检查功能Vb.net 线程系统.NullReferenceException,vb.net,multithreading,checkbox,Vb.net,Multithreading,Checkbox,我试图在选中或取消选中复选框时启动和停止自动检查功能 Private Sub CheckBoxautorefresh_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBoxautorefresh.CheckedChanged Dim AutoRefreshThread As Thread = Nothing If CheckBoxautorefresh.Checked Then A
Private Sub CheckBoxautorefresh_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBoxautorefresh.CheckedChanged
Dim AutoRefreshThread As Thread = Nothing
If CheckBoxautorefresh.Checked Then
AutoRefreshThread = New Threading.Thread(AddressOf Main.AutoRefresh)
AutoRefreshThread.SetApartmentState(Threading.ApartmentState.STA)
AutoRefreshThread.Start()
Else
AutoRefreshThread.Abort()
End If
End Sub
当我选中该复选框时,它会启动自动刷新子精细,并且可以工作。在这之后取消选中它时,我会在此行中得到一个System.NullReferenceException:
AutoRefreshThread.Abort()
Autorefresh函数只需每隔30秒下载一个字符串。
我喜欢用复选框来勾选自动刷新的开/关。
但由于某种原因,它不起作用。
有人能帮我吗?:) 您正在
CheckedChanged
事件中定义线程:
Dim AutoRefreshThread As Thread = Nothing
如果未选中该复选框,则引用的变量实际上尚未实例化(仅当选中该复选框时才会发生)。您不再引用选中复选框时创建的原始线程
尝试在事件之外定义
autorefreshtread
。我不太喜欢。中止,很多问题。看
试试这个模式
Dim thrd As Threading.Thread
Dim thrdStopped As New Threading.ManualResetEvent(False)
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked Then
If IsNothing(thrd) OrElse thrd.ThreadState <> Threading.ThreadState.Background Then
thrdStopped.Reset() '=false
thrd = New Threading.Thread(AddressOf someThread)
thrd.IsBackground = True
thrd.Start()
End If
ElseIf Not IsNothing(thrd) AndAlso thrd.ThreadState = Threading.ThreadState.Background Then
thrdStopped.Set() '=true
thrd.Join()
End If
End Sub
Private Sub someThread()
Do
Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.ff"))
Loop While Not thrdStopped.WaitOne(100) 'loop while false, sleep 100 ms.
End Sub
Dim thrd As Threading.Thread
Dim THRD作为新螺纹停止。手动复位事件(错误)
私有子CheckBox1_CheckedChanged(发送方作为对象,e作为事件参数)处理CheckBox1.CheckedChanged
如果复选框1.选中,则
如果为Nothing(thrd)或lse thrd.ThreadState Threading.ThreadState.Background,则
thrdStopped.Reset()'=false
thrd=新线程.Thread(someThread的地址)
thrd.IsBackground=True
thrd.Start()
如果结束
ElseIf Not IsNothing(thrd)和thrd.ThreadState=Threading.ThreadState.Background然后
thrdStopped.Set()'=true
thrd.Join()
如果结束
端接头
私有子线程()
做
Debug.WriteLine(DateTime.Now.ToString(“HH:mm:ss.ff”))
未停止时循环。WaitOne(100)'循环为false,睡眠100毫秒。
端接头
谢谢,伙计,这已经是解决方案了。我会把你的答案标记为已解决(让我=)