2014-03-25 34 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; 
} 

但它只是似乎笨重,再加上获取的,当我还需要一些switch语句行动来找出什么类型的参数,以便能够调用行动(参数)。另外如果我想支持多个参数呢?我应该使用object[] parameters吗?当然有更好的解决方案?

回答

1

发现在一个委托线程解决方案: How to store delegates in a List

我可以同时存储功能,并通过使用以下语法:

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

在行动中的参数类型这也解决了我的问题多个参数。

相关问题