3

我有 VS2010,我正在开发一个 Windows 窗体应用程序。

因此,我动态创建了线程(取决于用户输入),这些线程的处理可能需要一段时间(极端情况下需要几天)。所以我在表单上放了一个按钮,希望能够“暂停”或“暂停”线程。我查看了 .suspend 方法,它已被替换(我尝试过使用它,但有时它确实会失败 - 导致 UI 崩溃)所以我发现的新方法是“waithandle”。我已经阅读了这方面的文档,但我不知道如何使用它。

这是每个线程的基本结构:

Do
     'time consuming operations
loop 'a number of times

然后在一个单独的按钮中,我想放置暂停代码。快速暂停并不是那么重要,在循环的下一次运行时暂停就可以了(每次运行都非常快,它只会执行数百次)。我假设我必须将等待句柄检查放在循环的开头,但我实际上并不知道如何实现这一点。这是我的等待句柄暗码:

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 
4

1 回答 1

1

为此使用 ManualResetEvent。AutoResetEvent 几乎是一个信号量,因为您必须多次发出信号,因为您有线程正在等待 - 这在某些情况下会变得很尴尬。

创建事件信号,(即设置),并在你的线程中等待它的系统调用等待将对你的线程中的循环产生微不足道的影响的合适的点,即。也许不在最里面的循环中。

清除“暂停”按钮 OnClick() 中的事件,将其设置在“恢复”OnClick() 中。

抱歉,没有实际代码,因为我没有任何 VB,但应该很容易做到 :)

于 2012-08-24T07:19:30.670 回答