C# 暂停 foreach 循环直到按下按钮
C# pause foreach loop until button pressed
使用 C#,我有方法列表(操作)。
然后我有一个使用 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();
}
您可以添加计步器:
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();
}
您需要在按钮点击之间保持某种状态,以便您知道上次从哪里离开。我建议使用一个简单的计数器:
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
}
每次按下按钮时执行第一个动作,然后执行下一个动作等。
首先编写一个方法,在下一次按下特定的 Button
时生成 Task
:
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();
}
}
如果您只需要执行一次这些方法,我建议将它们添加到一个 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();
}
}
使用 C#,我有方法列表(操作)。 然后我有一个使用 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();
}
您可以添加计步器:
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();
}
您需要在按钮点击之间保持某种状态,以便您知道上次从哪里离开。我建议使用一个简单的计数器:
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
}
每次按下按钮时执行第一个动作,然后执行下一个动作等。
首先编写一个方法,在下一次按下特定的 Button
时生成 Task
:
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();
}
}
如果您只需要执行一次这些方法,我建议将它们添加到一个 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();
}
}