在我的csharp应用程序中,我有一些事件应该触发在特定线程上调用的函数,这会循环一些代码。
现在,不是手工存储所有这些数据而是有一个大的开关案例,我想知道是否可以将这些函数及其参数存储在一个列表中,然后由另一个线程处理?
伪代码:
var func = pointer2somefunction(13, "abc");
list.add(func);
其他主题:
while (list.Count > 0)
{
var func = list.Remove(0);
func.Invoke();
}
答案 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)
我认为你是以这种方式实施事件的。您不需要大的开关案例,需要多个事件,然后在正确的时间触发正确的事件,并使用正确的方法进行注册。
你可以做一个代表列表,但是当你想要不同的函数和不同的参数集时,它会变得复杂。