Ответ 1
Да, вы можете сделать это, используя List<Action>
или Queue<Action>
, который, по моему мнению, немного лучше. Action
- это тип для делегата void без параметров:
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>
для одного, Action<T, T>
для двух и так далее. Для возвращаемого значения используйте Func
вместо Action
(или Func<T>
и т.д.).
Возможно, вам тоже поможет событие. События - это функция языка С# для использования шаблона наблюдателя.
// 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>
выше, где вы можете запускать или повторно использовать потоки, делегат многоадресной рассылки отображается как один вызов извне, позволяя использовать только один поток для всех вызовов.