Как добавить пользовательские сообщения, поддерживающие параметры насоса?

Это связано с этим вопросом: Как создать собственный насос сообщений?

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

Это также решает мою проблему нескольких параметров.

Другие вопросы по тегам