我用C#实现了一个算法,想为它创建一个GUI界面。在我的GUI中,我想放置一个按钮,每次点击该按钮,GUI就会显示算法的下一步。因此,我认为需要在代码中添加“暂停”语句,以便在每次单击时可以恢复执行。我应该怎么做?或者还有其他建议来实现这个想法吗?
听起来你需要把你的算法变成一个状态机 - 而不是主动 "暂停" 它,你应该主动 "推进" 它。
如果你的算法基本上只有一个方法,那么你可能会发现迭代器块很有用,此时你可以在每个逻辑步骤结束时插入一个 yield return
语句,返回一些当前状态的指示。
这不是迭代器块的完全正常用法,但这可能是最简单的方法。你的用户界面将在开始时调用GetEnumerator
,然后每次点击按钮时调用 MoveNext()
(紧接着访问Current
属性以获取当前状态)。别忘了在完成后处理好迭代器的释放。
myWaitHandle.WaitOne()
(由您的算法线程调用)。myWaitHandle.Set()
来允许算法继续执行。这种方法的优点是,当您的算法执行一步操作时,用户界面仍然保持响应。
你需要决定在你的算法中什么是“步骤”。然后,你需要重写你的算法并将其封装在一个具有以下接口的类中:
interface ISteppedAlgorithm
{
bool NextStep(); //returns if the algorithm is finished
IStepResult LastStepResult {get;}
}
现在你的GUI将驱动以这种方式准备的算法。当你按下按钮时,NextStep()方法将被调用。如果它返回false,则禁用按钮(或以任何其他方式指示所有操作已完成)。然后读取LastStepResults并更新显示。
http://www.differentpla.net/content/2005/02/implementing-wizard-c
然而,如果您只是有一个长时间运行的任务,并希望在其中有一些休息时间,那么有不同的方法来解决它。
将任务分成多个方法。
在一个方法完成后,等待用户点击“下一步”。
让任务在它自己的线程中运行,在需要等待的地方让线程休眠,直到你设置了一个特定的变量:
LongRunningMethod1();
while(continue1 == true)
{
Thread.Sleep(50);
}
LongRunningMethod2()
while(continue2 == true)
{
Thread.Sleep(50);
}