【问题标题】:Threading System.NullReferenceException线程 System.NullReferenceException
【发布时间】:2014-03-24 22:56:05
【问题描述】:

我正在尝试在选中或取消选中复选框时启动和停止自动检查功能。

    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

当我选中复选框时,它会启动 AutoRefresh-Sub 并正常工作。当我在那之后取消选择它时,我在这一行得到一个 System.NullReferenceException:

   AutoRefreshThread.Abort()

自动刷新功能只是每 30 秒下载一个字符串。 我喜欢用一个复选框来检查这个自动刷新的开/关。 但由于某种原因,它不起作用。 有人可以帮我吗? :)

【问题讨论】:

    标签: vb.net multithreading checkbox


    【解决方案1】:

    您正在CheckedChanged 事件中定义线程:

    Dim AutoRefreshThread As Thread = Nothing
    

    当复选框未选中时,您引用的变量实际上尚未实例化(仅在选中复选框时发生)。您不再引用选中复选框时创建的原始线程。

    尝试在事件之外定义AutoRefreshThread

    【讨论】:

    • 谢谢,这已经是解决方案了。一旦 Stackoverflow 允许我,我会将您的答案标记为已解决 =)
    【解决方案2】:

    我不是 .Abort 的忠实粉丝,有很多陷阱。见http://msdn.microsoft.com/en-us/library/5b50fdsz%28v=vs.110%29.aspx

    试试这个模式。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2014-11-01
      • 2017-04-04
      • 1970-01-01
      • 2016-08-27
      相关资源
      最近更新 更多