2015-09-03 153 views
1

使用C#,我有方法列表(Actions)。 然後我有一個方法來調用使用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

爲什麼選擇使用'List '?你計劃迭代結構多少次?是否只有一次,直到所有的方法被調用,或者你打算循環?根據你的意圖,「堆棧」或「隊列」可能是更好的選擇。 –

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