.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中尝试使用该类的其他线程将被阻止。死锁很容易发生。