Ja, können Sie dies tun, indem Sie einen List<Action>
oder eine Queue<Action>
verwendet, die meiner Meinung nach etwas besser passt. Action
ist ein Typ für einen no-Parameter ungültig Delegaten:
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()();
}
Wenn Sie Parameter benötigen, verwenden Action<T>
für einen, Action<T, T>
für zwei und so weiter. Verwenden Sie für einen Rückgabewert Func
anstelle von Action
(oder Func<T>
usw.).
Vielleicht ein Ereignis würde auch Ihnen helfen. Ereignisse sind C# 's Sprachfeature, um das Beobachtermuster zu verwenden.
// 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);
}
Ein Ereignis ist ein Multicastdelegat, die ein Delegierter zu einer Liste der Funktionen ist. Sie können nicht das Einfädeln obwohl für jeden Handler steuern: Im Gegensatz zum Queue<Action>
oben, wo Sie Threads beginnen oder wieder verwenden können, ein Multicast-Delegate als ein Anruf ausgesetzt von außen, so dass Sie für alle Beschwörungen nur einen Thread verwenden.
Sie können [Delegaten] (http://msdn.microsoft.com/en-us/library/ms173172.aspx) verwenden, die C# 's Version von Funktionszeigern sind. –
Unabhängig davon, welche Methode Sie verwenden, stellen Sie sicher, dass Sie eine thread-sichere "Liste" verwenden, um sicherzustellen, dass keine Synchronisierungsprobleme zwischen den Threads auftreten. –