gpt4 book ai didi

vb.net - 如何在vb.net中使用waitHandle

转载 作者:行者123 更新时间:2023-12-01 02:24:25 25 4
gpt4 key购买 nike

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

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

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

Do
'time consuming operations
loop 'a number of times

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

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 

最佳答案

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

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

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

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

关于vb.net - 如何在vb.net中使用waitHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12101873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com