2015-09-03 7 views
1

Используя C#, у меня есть список методов (действий). У меня тогда есть метод для вызова действия с использованием цикла foreach. Кнопка вызывает метод, который в свою очередь вызывает каждое действие в списке за один раз. То, что я делаю, это щелчок, чтобы выполнить только одно действие за клик. Спасибо заранее.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(); 
    } 
+0

Почему вы решили использовать «Список '? Сколько раз вы планируете итерировать структуру? Это только один раз, пока не будут вызваны все методы или вы планируете цикл? В зависимости от вашего намерения, 'Stack' или' Queue' может быть лучшим выбором. –

+0

Честно говоря, потому что я новичок в программировании и не знал об этом :) – justlearning

ответ

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(); 
    } 
+0

Спасибо и всем остальным. Я использовал это решение в конце. – justlearning

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 
} 

Выполнение первого действия, затем следующего и т. Д. При каждом нажатии кнопки.

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(); 
    } 
} 
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(); 
    } 
} 
Смежные вопросы