Это связано с этим вопросом: How to create custom message pump?Как добавить настраиваемые параметры насоса сообщений?
Я в основном нуждаются в таком же сообщение насоса, за исключением того, он также должен быть в состоянии поддерживать входные параметры. Ответ из вышеизложенного вопроса поддерживает только делегаты 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 хранить пользовательский класс вместо действий, скажем, под названием ActionWithParameter, который будет выглядеть следующим:
class ActionWithParameter
{
Action action;
object parameter;
}
Но это только кажется неуклюжим, плюс я также потребуется некоторое переключатель заявление, когда Извлечение чтобы определить, какой тип является параметром, чтобы иметь возможность вызвать действие (параметр). И что, если я хотел бы поддерживать несколько параметров? Должен ли я использовать object[] parameters
? Неужели есть лучшее решение?