我有VS2010,我正在开发一个Windows窗体应用程序。
因此,我有动态创建的线程(取决于用户输入),这些线程的处理可能需要一段时间(在极端情况下为几天)。所以我在表单上放了一个按钮,希望能够“暂停”或“暂停”线程。我已经查找了.suspend方法,它已被替换(我已经尝试过使用它但有时会失败 - 导致UI崩溃)所以我发现这样做的新方法是'waithandle'。我已经阅读了相关的文档,我无法弄清楚如何使用它。
这是每个线程的基本结构:
Do
'time consuming operations
loop 'a number of times
然后在一个单独的按钮中我想要暂停代码。快速暂停并不是那么重要,在下一次循环中暂停是很好的(每次运行都很快,它只做了几百次)。我假设我必须在循环开始时检查waithandle但我实际上并不知道如何实现它。这是我的waithandle昏暗代码:
Dim waitHandles As System.Threading.EventWaitHandle = New System.Threading.AutoResetEvent(True)
所有线程都要暂停(主UI线程除外)所以我认为这意味着我只需要一个等待句柄,但我不确定。
无论如何,如果有人能告诉我什么代码进入do循环以及什么进入暂停按钮我想我可以解决其他问题。 :)
非常感谢!
弗雷泽
来自评论:
谢谢!我搞定了。这是我的意思:
Dim mre As New System.Threading.ManualResetEvent(True)
(位于代码的顶部(就在'public class form 1'下) 然后在线程中:
mre.WaitOne(),
最后在暂停/取消其所拥有的线程的按钮中:
mre.Reset() 'to resume the threads and, mre.Set() 'to pause the threads
答案 0 :(得分:1)
为此使用ManualResetEvent。 AutoResetEvent“几乎是一个信号量”,你必须多次发出信号,因为你有等待的线程 - 在某些情况下这会变得很尴尬。
创建事件信号,(即设置),并在线程中等待它,系统调用wait将对线程中的循环产生可忽略不计的影响,即。也许不是在最里面的循环中。
在“暂停”按钮OnClick()中清除事件,在“恢复”OnClick()中设置它。
对不起,没有实际代码'因为我没有任何VB,但应该很容易做到:)