Подтвердить что ты не робот

Сбор функций

в моем приложении csharp у меня есть определенные события, которые должны вызывать функции, вызываемые в определенном потоке, который перебирает какой-то код.

теперь вместо того, чтобы хранить все эти данные вручную и иметь большой случай переключения, мне было интересно, можно ли хранить эти функции и их параметры в списке, который затем обрабатывается другим потоком?

псевдокод:

var func = pointer2somefunction(13, "abc");
list.add(func);

другой поток:

while (list.Count > 0)
{
     var func = list.Remove(0);
     func.Invoke();
}
4b9b3361

Ответ 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> выше, где вы можете запускать или повторно использовать потоки, делегат многоадресной рассылки отображается как один вызов извне, позволяя использовать только один поток для всех вызовов.

Ответ 2

Я думаю, что вы реализуете события таким образом. Вам не нужен большой случай переключения, вам нужно несколько событий, а затем запустить правильное событие в нужное время и зарегистрировать его с помощью правильного метода.

Вы можете сделать список делегатов, но он начнет усложняться, если вам нужна другая функция с различным набором параметров.