功能集合

时间:2013-07-29 08:24:47

标签: c#

在我的csharp应用程序中,我有一些事件应该触发在特定线程上调用的函数,这会循环一些代码。

现在,不是手工存储所有这些数据而是有一个大的开关案例,我想知道是否可以将这些函数及其参数存储在一个列表中,然后由另一个线程处理?

伪代码:

var func = pointer2somefunction(13, "abc");
list.add(func);

其他主题:

while (list.Count > 0)
{
     var func = list.Remove(0);
     func.Invoke();
}

2 个答案:

答案 0 :(得分:18)

是的,您可以使用List<Action>Queue<Action>来完成此操作,我认为这种情况略好一些。 Action是无参数void 委托的类型:

var functions = new Queue<Action>();

functions.Enqueue(() => Console.WriteLine("Foo"));
functions.Enqueue(() => Console.WriteLine("Bar"));

while (functions.Any())
{
    // note the double parenthesis here: one for Dequeue
    // and one for your dequeued function
    functions.Dequeue()();
}

如果您需要参数,请将Action<T>用于一个,Action<T, T>用于两个,依此类推。对于返回值,请使用Func代替Action(或Func<T>等)。

也许事件也可以帮到你。事件是C#的语言功能,可以使用观察者模式

// events are usually on the instance rather than static
private static event EventHandler MyEvent;

static void Main(string[] args)
{
    MyEvent += (s, e) => Console.WriteLine("FooEvent");
    MyEvent += (s, e) => Console.WriteLine("BarEvent");
    MyEvent(null, EventArgs.Empty);
}

事件是多播委托,它是功能列表的委托。您无法控制每个处理程序的线程:与上面的Queue<Action>不同,您可以在其中启动或重用线程,多播委托从外部显示为一个调用,只允许您使用一个所有调用的线程。

答案 1 :(得分:1)

我认为你是以这种方式实施事件的。您不需要大的开关案例,需要多个事件,然后在正确的时间触发正确的事件,并使用正确的方法进行注册。

你可以做一个代表列表,但是当你想要不同的函数和不同的参数集时,它会变得复杂。