2014-03-25 4 views
0

Это связано с этим вопросом: 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? Неужели есть лучшее решение?

ответ

1

Найдено решение в делегатском теме: How to store delegates in a List

можно хранить как функцию и аргумент в типе действий, используя следующий синтаксис .:

actions.Add(new Action(() => MyFunction(myParameter))); 

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

 Смежные вопросы

  • Нет связанных вопросов^_^