函数集合
本文关键字:集合 函数 | 更新日期: 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>
不同,您可以在其中启动或重用线程,多播委托作为来自外部的一个调用公开,允许您对所有调用仅使用一个线程。
我认为您正在以这种方式实现事件。你不需要一个大的开关案例,你需要几个事件,然后在正确的时间触发正确的事件,用正确的方法注册。
你可以做一个委托列表,但是当你想要不同的函数和不同的参数集时,它会开始变得复杂。