Как добавить пользовательские сообщения, поддерживающие параметры насоса?
Это связано с этим вопросом: Как создать собственный насос сообщений?
Мне в основном нужен тот же насос сообщений, за исключением того, что он также должен поддерживать входные параметры. Ответ на вопрос выше поддерживает только делегаты Action(), которые не принимают параметры. Я хочу иметь возможность передавать параметры своим действиям. Вот версия без параметров:
public class MessagePump
{
private BlockingCollection<Action> actions = new BlockingCollection<Action>();
public void Run() //you may want to restrict this so that only one caller from one thread is running messages
{
foreach (var action in actions.GetConsumingEnumerable())
action();
}
public void AddWork(Action action)
{
actions.Add(action);
}
public void Stop()
{
actions.CompleteAdding();
}
}
Какой правильный способ сделать это? Я думал о том, чтобы сделать BlockingCollection хранить собственный класс вместо Action, скажем, с именем ActionWithParameter, который будет выглядеть следующим образом:
class ActionWithParameter
{
Action action;
object parameter;
}
Но это просто кажется неуклюжим, плюс мне также понадобится некоторая инструкция switch при извлечении действия, чтобы выяснить, какой тип является параметром, чтобы иметь возможность вызывать action(параметр). И что, если я хочу поддерживать несколько параметров? Должен ли я использовать object[] parameters
затем? Конечно, есть лучшее решение?
1 ответ
Нашел решение в потоке делегата: Как хранить делегатов в Списке
Я могу хранить как функцию, так и аргумент в типе Action, используя следующий синтаксис.:
actions.Add(new Action(() => MyFunction(myParameter)));
Это также решает мою проблему нескольких параметров.