はい、私の意見では、 aList<Action>
または aを使用してこれを行うことができます。パラメーターなしの voidデリゲートの型です。Queue<Action>
Action
var functions = new Queue<Action>();
functions.Enqueue(() => Console.WriteLine("Foo"));
functions.Enqueue(() => Console.WriteLine("Bar"));
while (functions.Any())
{
// note the double parenthesis here: one for Dequeue
// and one for your dequeued function
functions.Dequeue()();
}
パラメータが必要な場合は、Action<T>
for one、Action<T, T>
for two などを使用します。戻り値については、Func
代わりにAction
(またはFunc<T>
など) を使用します。
イベントも参考になるかも。イベントは、オブザーバー パターンを使用するための C# の言語機能です。
// events are usually on the instance rather than static
private static event EventHandler MyEvent;
static void Main(string[] args)
{
MyEvent += (s, e) => Console.WriteLine("FooEvent");
MyEvent += (s, e) => Console.WriteLine("BarEvent");
MyEvent(null, EventArgs.Empty);
}
イベントはマルチキャスト デリゲートであり、関数のリストへのデリゲートです。ただし、各ハンドラーのスレッド化を制御することはできません。スレッドをQueue<Action>
開始または再利用できる上記とは異なり、マルチキャスト デリゲートは外部からの1 つの呼び出しとして公開されるため、すべての呼び出しに対して 1 つのスレッドのみを使用できます。