我有一个Windows窗体和一个类,它有两个以非确定的方式递归运行的简单方法(意思是不知道哪个递归会被调用,都可以调用另一个)。现在,递归期间有一些点我想暂停执行并等待用户点击“下一步”按钮。只有按下按钮后,递归函数才会继续。该类在单独的线程上运行,因此它不会阻止UI。如何使后台线程暂停,然后继续点击按钮?
在暂停期间,窗体只会从类中检索值并将其显示在列表框中。然后在按下按钮后,递归继续,直到下一个Pause()。我需要这个,所以用户可以一步一步看到递归中发生了什么。此外,我需要能够在递归方法(甚至多次)中的任何位置放置Pause(),而不会产生任何副作用...
我想到的唯一方法是调用Pause()方法一个循环检查一些锁定标志,然后睡眠一段时间(按钮会设置标志),但是我在Windows窗体中使用了Thread.Sleep()方法(锁定UI),所以我正在查看另一个选项。
有没有干净的方法来做到这一点?
这有点修改,因为用户不会暂停,函数本身暂停。用户只执行该步骤。但是我已经把Reset()和WaitOne()放在我的Pause()中,然后在按钮上点击了我简单的Set()。它以满意的方式工作。这很有趣,我从来没有注意到这堂课。 – 2009-12-23 00:28:51
这就是AutoResetEvent的工作原理。它会在线程成功等待时自动重置。 – 2009-12-23 00:33:44
是的,AutoResetEvent也适用于我的场景,实际上使得代码更短(一行)。所以现在我只能在我的Pause()中调用WaitOne(),剩下的代码保持不变。 – 2009-12-23 08:08:22