如何在C#中实现逐步按钮?

3

我用C#实现了一个算法,想为它创建一个GUI界面。在我的GUI中,我想放置一个按钮,每次点击该按钮,GUI就会显示算法的下一步。因此,我认为需要在代码中添加“暂停”语句,以便在每次单击时可以恢复执行。我应该怎么做?或者还有其他建议来实现这个想法吗?

5个回答

15

听起来你需要把你的算法变成一个状态机 - 而不是主动 "暂停" 它,你应该主动 "推进" 它。

如果你的算法基本上只有一个方法,那么你可能会发现迭代器块很有用,此时你可以在每个逻辑步骤结束时插入一个 yield return 语句,返回一些当前状态的指示。

这不是迭代器块的完全正常用法,但这可能是最简单的方法。你的用户界面将在开始时调用GetEnumerator,然后每次点击按钮时调用 MoveNext()(紧接着访问Current属性以获取当前状态)。别忘了在完成后处理好迭代器的释放。


2
  1. 在与UI线程不同的线程中运行您的算法。
  2. 为了同步,创建某种等待处理方式,例如AutoResetEvent
  3. "暂停"语句是myWaitHandle.WaitOne()(由您的算法线程调用)。
  4. 通过在UI线程中执行myWaitHandle.Set()来允许算法继续执行。

这种方法的优点是,当您的算法执行一步操作时,用户界面仍然保持响应。


0

你需要决定在你的算法中什么是“步骤”。然后,你需要重写你的算法并将其封装在一个具有以下接口的类中:

interface ISteppedAlgorithm
{
    bool NextStep(); //returns if the algorithm is finished
    IStepResult LastStepResult {get;}
}

现在你的GUI将驱动以这种方式准备的算法。当你按下按钮时,NextStep()方法将被调用。如果它返回false,则禁用按钮(或以任何其他方式指示所有操作已完成)。然后读取LastStepResults并更新显示。


0
根据您的描述,我认为您想要一个“向导”,它基本上是一个带有前/后按钮的应用程序。

http://www.differentpla.net/content/2005/02/implementing-wizard-c

然而,如果您只是有一个长时间运行的任务,并希望在其中有一些休息时间,那么有不同的方法来解决它。

  1. 将任务分成多个方法。

    在一个方法完成后,等待用户点击“下一步”。

  2. 让任务在它自己的线程中运行,在需要等待的地方让线程休眠,直到你设置了一个特定的变量:

    LongRunningMethod1();
    while(continue1 == true)
    {
        Thread.Sleep(50);
    }
    LongRunningMethod2()
    while(continue2 == true)
    {
        Thread.Sleep(50);
    }
    
在主线程中将continue1和2设置为true,以便后台线程完成它的工作。

0
如果只是为了“观察”算法的状态发展,为什么不添加一些事件(可能只有一个在最后),并让事件处理程序存储状态数组。UI可以根据需要简单地向前/向后迭代这个数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接