在我正在开发的程序中,我有两个主要线程:UI线程和与硬件接口的后台线程。在运行期间的表单上,我有一个暂停按钮,应该停止测试,直到单击恢复按钮。从功能上来说,这意味着我想使用UI线程暂停硬件线程,并且由于Thread.Suspend
已被弃用,我试图避免这种情况。
我尝试使用AutoResetEvent
,遗憾的是导致UI线程自行挂起,然后在尝试发送UI更新请求时锁定硬件线程。
有没有一种好方法可以在执行的任何时候使用一个线程在VB.NET中挂起另一个线程?
顺便说一下,我已经看过Suspend a thread from another thread in VB.NET了,虽然问题很相似,但答案最终基本上与我正在尝试做的事情相反。
设置我的代码,以便多线程实际上通过多线程对象发生,并且表单调用该对象中的异步Run
例程。我将尝试提供最相关的信息,但如果您希望看到代码的其他部分,请告诉我,我可以添加它们。
在frmRun
'Multithreaded object copied from global to local context
Private currentprofile as MTProfile = Main.testprofile
'Button click handler to start the run
Private Sub btnRunTest_Click(sender As System.Object, e As System.EventArgs) Handles btnRunTest.Click
currentprofile.RunAsync()
End Sub
在MTProfile
'Asynchronous call to run subroutine
'_thread1 is a member of the MTProfile class
Public Sub RunAsync()
_thread1 = New Threading.Thread(AddressOf Run)
_thread1.IsBackground = True
_thread1.Start()
End Sub
'Run subroutine
Public Sub Run()
For i As Integer = 0 To _profile.Count - 1
'Get information for the action in the profile and carry that action out
'Actions can last anywhere from 50 s to over 10 minutes
Next
End Sub
我目前关于让代码暂停的想法是单击表单上的暂停按钮引发对象捕获的事件并要求_thread1
暂停。我遇到的两个主要问题是我可以使用什么函数来实际让线程暂停以及如何设置事件触发器以便它仍然允许封装类。
至于为什么我认为这个问题不是Pause/Resume loop in Background worker的重复,有两个主要原因。最重要的是我希望能够在任何时候而不是在每次循环迭代之后暂停我的进程,我不认为我可以使用该解决方案而不在我的每个命令之后放置WaitOne
命令环。第二个,我认为更重要的是,我正在直接操纵我的线程,而不是使用BackgroundWorker
。