C#暂停foreach循环直到按下按钮

时间:2015-09-03 19:09:45

标签: c# loops button foreach pause

使用C#,我有方法列表(Actions)。 然后我有一个使用foreach循环调用动作的方法。 单击按钮会调用该方法,该方法依次调用列表中的每个操作。 我所追求的是点击只对每次点击执行一个动作。 提前谢谢。

private static List<Action> listOfMethods= new List<Action>();

listOfMethods.Add(() => method1());
listOfMethods.Add(() => method2());
listOfMethods.Add(() => method3());
//====================================================================
private void invokeActions()
{
   foreach (Action step in listOfMethods)
   {
       step.Invoke();
       //I want a break here, only to continue the next time the button is clicked
   }
}
//====================================================================
private void buttonTest_Click(object sender, EventArgs e)
    {
        invokeActions();
    }

4 个答案:

答案 0 :(得分:2)

您可以添加一个步数计数器:

private static List<Action> listOfMethods= new List<Action>();
private static int stepCounter = 0;

listOfMethods.Add(() => method1());
listOfMethods.Add(() => method2());
listOfMethods.Add(() => method3());
//====================================================================
private void invokeActions()
{
       listOfMethods[stepCounter]();

       stepCounter += 1;
       if (stepCounter >= listOfMethods.Count) stepCounter = 0;
}
//====================================================================
private void buttonTest_Click(object sender, EventArgs e)
    {
        invokeActions();
    }

答案 1 :(得分:1)

您需要在按钮点击之间保持一些状态,以便您知道上次离开的位置。我建议使用一个简单的计数器:

private int _nextActionIndex = 0;

private void buttonTest_Click(object sender, EventArgs e)
{
    listOfMethods[_nextActionIndex]();
    if (++_nextActionIndex == listOfMethods.Count)
        _nextActionIndex = 0;    // When we get to the end, loop around
}

每次按下按钮时,执行第一个动作,然后执行下一个动作等。

答案 2 :(得分:0)

首先编写一种方法,以便在下次按下特定Task时生成Button

public static Task WhenClicked(this Button button)
{
    var tcs = new TaskCompletionSource<bool>();
    EventHandler handler = null;
    handler = (s, e) =>
    {
        tcs.TrySetResult(true);
        button.Click -= handler;
    };
    button.Click += handler;
    return tcs.Task;
}

然后在下一个按钮按下后,只需await在你的方法中它就可以了:

private async Task invokeActions()
{
    foreach (Action step in listOfMethods)
    {
        step.Invoke();
        await test.WhenClicked();
    }
}

答案 3 :(得分:0)

如果您只需要执行一次方法,我建议将它们添加到Queue<T>,因此不需要维护状态。

private static Queue<Action> listOfMethods = new Queue<Action>();
listOfMethods.Enqueue(method1);
listOfMethods.Enqueue(method2);
listOfMethods.Enqueue(method3);   

private void buttonTest_Click(object sender, EventArgs e) {
    if (listOfMethods.Count > 0) {
        listOfMethods.Dequeue().Invoke();
    }
}