函数集合

本文关键字:集合 函数 | 更新日期: 2023-09-27 18:25:14

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

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

伪代码:

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

其他线程:

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

函数集合

是的,您可以使用我认为更适合的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> 2 个参数,依此类推。对于返回值,请使用 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>不同,您可以在其中启动或重用线程,多播委托作为来自外部的一个调用公开,允许您对所有调用仅使用一个线程。

我认为您正在以这种方式实现事件。你不需要一个大的开关案例,你需要几个事件,然后在正确的时间触发正确的事件,用正确的方法注册。

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