C#让程序等待按下按钮

时间:2011-04-11 22:25:23

标签: c# loops button wait boolean

我想让程序等待按钮在继续之前被按下,我尝试创建一个while循环并让它循环直到单击按钮并将bool设置为true以使while循环结束,这样做它崩溃了

   while (!Redpress)
                    {
                        //I'd like the wait here
                    }
                    Redpress = false;

无论是否在那里,只要程序在将“Redpress”设置为false之前等待按下按钮就没关系......有什么想法吗?

4 个答案:

答案 0 :(得分:6)

使用事件 - 这是他们的目的。

您不需要在Button_Click事件处理程序中使用布尔变量来调用您的代码:

private void Button_Click(object sender, EventArgs e)
{
    // The code you need to execute when the button is pressed
}

正如@trickdev所指出的那样,您需要订阅此事件,但如果您在Visual Studio中使用“事件”窗口,它将为您添加必要的代码 - 包括空处理程序。

通过事件驱动程序,您总是在等待下一个“事情”发生。因此,在您的情况下(如果我已正确理解您的应用程序),当您启动程序时,它应该只是告诉第一个按钮闪烁“N”次。如果您将其写为事件,那么一旦代码完成,应用程序将返回等待状态。

然后在按钮单击事件处理程序中 - 您可以将所有按钮订阅到同一事件 - 您可以检查是否按下了正确的按钮,然后告诉下一个按钮闪烁。如果按下了错误的按钮,则显示一条合适的消息。

所以在伪代码中你有:

public class Form
{
    Initialise()
    {
        this.Loaded += FormLoaded;
    }

    private void FormLoaded(object sender, EventArgs e)
    {
        // pick a button
        pickedButton.Flash();
    }

    private void Button_Click(object sender, EventArgs e)
    {
        if (sender == pickedButton)
        {
            pickedButton = pickButton();
        }
        else
        {
            message = "Sorry wrong button, try again";
        }

        pickedButton.Flash();
    }
}

public class Button
{
    public void Flash()
    {
        // loop N times turning button on/off
    }
}

答案 1 :(得分:2)

Windows窗体控件有一个可以在表单构造函数中订阅的Click事件:

myButton.Click += myButton_EventHandler;

然后,您可以在处理程序中放置您想要发生的任何逻辑,这将在单击按钮时执行:

private void myButton_EventHandler(object sender, EventArgs e)
{
    Redpress = false;
}

你应该避免阻止(以任何方式,旋转睡眠等)表单应用程序中的主线程,因为这将锁定接口,有许多方法可以避免这种情况,包括定时器,线程,代理和背景工作者等等。

编辑:要包含您的更新

为此,您可以使用ManualResetEvent

private readonly ManualResetEvent mre = new ManualResetEvent(false);

private void myButton_EventHandler(object sender, EventArgs e)
{
    mre.Set();
}

您的表单代码可以通过以下方式等待:

mre.WaitOne();

这将使执行代码等到事件被触发。希望有所帮助。

注意:请不要误会,除非你有一些特殊情况(我在晚上的这个时候想不到一个!)你应该把代码直接放在事件处理程序中而不是在事件被触发之前阻塞线程。

答案 2 :(得分:0)

如果您需要程序等待该事件,那么不会在主访问/页面加载中写入waitForTheButton代码。

而是在事件中编写代码。所以你不必进行积极的等待。事件就是为了这个。

例如:如果你有类似的东西

static void Main()
{
    while (notPressed) { }
    DoThis();
    DoThat();
}

然后您可以将其更改为:

static void Main
{
    myButton.OnClick += myButton_EventHandler;
}

private void myButton_EventHandler(object sender, EventArgs e)
{
    DoThis();
    DoThat();
}                                     

如果您确实希望使用程序范例,即使使用 OOP 语言,也应使用信号量或其他内容像那样。但这似乎并不是你真正需要的,它更像是你想要的东西。

答案 3 :(得分:0)

不知道你为什么要坚持在那里,我认为这是真正的问题。 我猜您在代码中,在某些情况下,您希望根据用户操作执行另一个代码,然后在主块中恢复剩余的代码。

当我处理这种情况时,我使用了我自己的队列控制器类。 该类实际上执行 AddAction(Action)、PlayNext() 和 HasActions()

所以在你的那个时候,我在你的循环之后将代码添加到我班级中的一个动作并执行 AddAction。

我也在按钮事件中执行 AddAction(Action, position) 然后在 HasActions() PlayNext()

这样我就不会阻塞界面并确保按钮代码在我的两段代码之间运行。