.net 在按钮上暂停线程在按钮上单击继续

.net 在按钮上暂停线程在按钮上单击继续,.net,vb.net,multithreading,.net,Vb.net,Multithreading,我有一个从一些网站获取数据的循环,这个循环大约需要一个小时来获取数据并将其填充到数据库中,这个循环在一个线程中,我想添加一个按钮来暂停线程,直到再次单击该按钮,并从停止的位置恢复。 如何以安全的方式执行此操作?试试以下方法: 恢复: Public Sub ResumeThreadButton_Click(sender As System.Object, e As System.EventArgs) Handles ResumeThreadButton.Click 'REM: Next

我有一个从一些网站获取数据的循环,这个循环大约需要一个小时来获取数据并将其填充到数据库中,这个循环在一个线程中,我想添加一个按钮来暂停线程,直到再次单击该按钮,并从停止的位置恢复。 如何以安全的方式执行此操作?

试试以下方法:

恢复:

Public Sub ResumeThreadButton_Click(sender As System.Object, e As System.EventArgs) Handles ResumeThreadButton.Click
    'REM: Next line resumes your thread
    TheThread.Resume()
End Sub
试试这个:

恢复:

Public Sub ResumeThreadButton_Click(sender As System.Object, e As System.EventArgs) Handles ResumeThreadButton.Click
    'REM: Next line resumes your thread
    TheThread.Resume()
End Sub

这是一个简单的Windows控制台应用程序;它使用一个布尔标志指示线程是否应该处理。我希望这为你指明了正确的方向

Module Module1

    Private _ThreadControl_Run As Boolean = False

    Sub Main()
        Dim thread As New System.Threading.Thread(AddressOf ThreadWorker)
        thread.IsBackground = True
        thread.Start()

        _ThreadControl_Run = True
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)

        _ThreadControl_Run = False
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)

        _ThreadControl_Run = True
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)

        _ThreadControl_Run = False
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)
    End Sub

    Private Sub ThreadWorker()
        Do While True
            If (_ThreadControl_Run) Then
                Console.WriteLine("     ThreadWorker()")
                System.Threading.Thread.Sleep(100)
            End If
        Loop
    End Sub

End Module

这是一个简单的Windows控制台应用程序;它使用一个布尔标志指示线程是否应该处理。我希望这为你指明了正确的方向

Module Module1

    Private _ThreadControl_Run As Boolean = False

    Sub Main()
        Dim thread As New System.Threading.Thread(AddressOf ThreadWorker)
        thread.IsBackground = True
        thread.Start()

        _ThreadControl_Run = True
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)

        _ThreadControl_Run = False
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)

        _ThreadControl_Run = True
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)

        _ThreadControl_Run = False
        Console.WriteLine("Main() _ThreadControl_Run = " & _ThreadControl_Run.ToString())
        System.Threading.Thread.Sleep(1000)
    End Sub

    Private Sub ThreadWorker()
        Do While True
            If (_ThreadControl_Run) Then
                Console.WriteLine("     ThreadWorker()")
                System.Threading.Thread.Sleep(100)
            End If
        Loop
    End Sub

End Module

查看此MSDN Helps查看此MSDN helpsThreadState是否为只读属性。它获取当前线程的状态;不能使用此属性设置线程的状态。看@RandyDodson:看我的道歉。我已经更正了上面的代码(我正在考虑If…Then语句)。上面的代码确实更改了Thread.ThreadState,但不是直接更改。是。在挂起之前,它会等待线程处于安全位置。如果要中止线程,请将
Suspend
替换为
abort
。此API现在已过时。不要使用Suspend和Resume方法来同步线程的活动。挂起线程时,无法知道线程正在执行什么代码。如果在安全权限评估期间挂起一个线程,而该线程持有锁,则AppDomain中的其他线程可能会被阻止。如果在线程执行类构造函数时挂起该线程,则AppDomain中尝试使用该类的其他线程将被阻止。死锁很容易发生。ThreadState是一个只读属性。它获取当前线程的状态;不能使用此属性设置线程的状态。看@RandyDodson:看我的道歉。我已经更正了上面的代码(我正在考虑If…Then语句)。上面的代码确实更改了Thread.ThreadState,但不是直接更改。是。在挂起之前,它会等待线程处于安全位置。如果要中止线程,请将
Suspend
替换为
abort
。此API现在已过时。不要使用Suspend和Resume方法来同步线程的活动。挂起线程时,无法知道线程正在执行什么代码。如果在安全权限评估期间挂起一个线程,而该线程持有锁,则AppDomain中的其他线程可能会被阻止。如果在线程执行类构造函数时挂起该线程,则AppDomain中尝试使用该类的其他线程将被阻止。死锁很容易发生。