Sì, è possibile farlo utilizzando un List<Action>
o un Queue<Action>
che si adatta un po 'meglio a mio parere. Action
è un tipo per un no-parametro vuoto delegato:
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()();
}
Se avete bisogno di parametri, utilizzare Action<T>
per uno, Action<T, T>
per due e così via. Per un valore restituito, utilizzare Func
anziché Action
(o Func<T>
ecc.).
Forse un evento ti può aiutare. Gli eventi sono funzionalità di linguaggio C# per utilizzare il modello di osservatore .
// 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);
}
un evento è un delegato multicast , che è un delegato ad un elenco di funzioni. Tuttavia, non è possibile controllare il threading per ogni gestore: a differenza dello Queue<Action>
in cui è possibile avviare o riutilizzare i thread, un delegato multicast viene esposto come dall'esterno una chiamata, consentendo di utilizzare solo un thread per tutte le chiamate.
fonte
2013-07-29 08:28:20
È possibile utilizzare [delegati] (http://msdn.microsoft.com/en-us/library/ms173172.aspx), che sono la versione di puntatori di funzione di C#. –
Qualunque sia il metodo che usi, assicurati di utilizzare un 'Elenco' sicuro per i thread per assicurarti che non si verifichino problemi di sincronizzazione tra i thread. –