【问题标题】:How to use waitHandle in vb.net如何在 vb.net 中使用 waitHandle
【发布时间】:2012-09-01 02:21:42
【问题描述】:

我有 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 

【问题讨论】:

    标签: vb.net multithreading suspend waithandle


    【解决方案1】:

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

    创建事件信号,(即设置),并在您的线程中等待它的系统调用等待将对您的线程中的循环产生可忽略不计的影响的合适点,即。可能不在最里面的循环中。

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

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

    【讨论】:

    • 谢谢!我让它工作了。这是我的暗示: Dim mre As New System.Threading.ManualResetEvent(True) (在代码的顶部(就在'public class form 1'下面)然后在它具有的线程中:mre.WaitOne(),最后在暂停/取消暂停它拥有的线程的按钮:mre.Reset()'恢复线程,mre.Set()'暂停线程:)(如果有人可以编辑它以使其更整洁,我想它会对其他人有所帮助,我只是不知道如何!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2014-01-31
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多