2

C# を使用して、メソッド (アクション) のリストがあります。次に、foreach ループを使用してアクションを呼び出すメソッドを用意します。ボタンをクリックするとメソッドが呼び出され、リスト内のすべてのアクションが一度に呼び出されます。私が求めているのは、クリックがクリックごとに 1 つのアクションのみを実行することです。前もって感謝します。

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

4 に答える 4

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();
    }
于 2015-09-03T19:12:55.483 に答える
1

最初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();
    }
}
于 2015-09-03T19:18:28.577 に答える
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
}

これにより、ボタンが押されるたびに最初のアクションが実行され、次に次のアクションが実行されます。

于 2015-09-03T19:13:09.447 に答える
0

メソッドを 1 回だけ実行する必要がある場合は、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();
    }
}
于 2015-09-03T19:23:52.630 に答える