gpt4 book ai didi

c# - 功能集合

转载 作者:可可西里 更新时间:2023-11-01 08:06:36 25 4
gpt4 key购买 nike

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

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

伪代码:

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 delegate 的类型:

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);
}

一个事件是一个多播委托(delegate),它是一个函数列表的委托(delegate)。但是,您无法控制每个处理程序的线程:与 Queue<Action> 不同在上面,您可以启动或重用线程的地方,一个多播委托(delegate)从外部公开为一个调用,让您只使用一个线程进行所有调用。

关于c# - 功能集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com