如何添加支持参数的自定义消息泵?

时间:2014-03-25 16:39:28

标签: c# multithreading action blockingcollection message-pump

这与此问题有关: 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存储一个自定义类而不是Action,假设叫做ActionWithParameter,它看起来如下:

class ActionWithParameter
{
   Action action;
   object parameter;
}

但它看起来很笨重,另外我还需要一些switch语句来获取动作来确定参数是什么类型,以便能够调用action(参数)。如果我想支持多个参数呢?我应该使用object[] parameters吗?当然有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

在委托线程中找到解决方案: How to store delegates in a List

我可以使用以下语法将函数和参数存储在Action类型中:。

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

这也解决了我的多个参数问题。