【问题标题】:Pause thread on button click resume on button click按钮单击时暂停线程单击按钮时恢复
【发布时间】:2012-07-14 03:56:45
【问题描述】:

我有一个从某些网站获取数据的循环,该循环大约需要一个小时才能获取数据并将其填充到数据库中,这个循环在一个线程中,我想添加一个按钮来暂停线程,直到再次单击按钮并从停止的地方恢复。 我怎样才能安全地做到这一点?

【问题讨论】:

标签: .net vb.net multithreading


【解决方案1】:

这是一个简单的 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

【讨论】:

    【解决方案2】:

    试试这个:

    Public Sub PauseThreadButton_Click(sender As System.Object, e As System.EventArgs) Handles PauseThreadButton.Click
        'REM: Next line puts your thread in a suspended state
        TheThread.Suspend()
    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
    

    【讨论】:

    • ThreadState 是只读属性。它获取当前线程的状态;您不能使用此属性设置线程的状态。见Thread.ThreadState
    • 我很抱歉。我已经更正了上面的代码(我在想一个 If...Then 语句。)。上面的代码确实改变了 Thread.ThreadState,只是没有直接改变。
    • 是的。它会等到线程处于安全位置后再挂起。如果要中止线程,请将Suspend 替换为Abort
    • 此 API 现已过时。不要使用 Suspend 和 Resume 方法来同步线程的活动。当您挂起线程时,您无法知道线程正在执行什么代码。如果在安全权限评估期间挂起一个线程而它持有锁,则 AppDomain 中的其他线程可能会被阻止。如果在执行类构造函数时挂起线程,则 AppDomain 中尝试使用该类的其他线程将被阻止。死锁很容易发生。 Thread.Suspend
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多