Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 线程系统.NullReferenceException_Vb.net_Multithreading_Checkbox - Fatal编程技术网

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毫秒。
端接头

谢谢,伙计,这已经是解决方案了。我会把你的答案标记为已解决(让我=)