13

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

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

伪代码:

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

其他线程:

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

2 回答 2

18

是的,您可以使用 aList<Action>或 a来做到这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>for one,Action<T, T>for two,依此类推。对于返回值,使用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>上面可以启动或重用线程的方式不同,多播委托被公开为来自外部的一次调用,让您只使用一个线程进行所有调用。

于 2013-07-29T08:28:20.360 回答
1

我认为您正在以这种方式实施事件。你不需要一个大的switch case,你需要几个事件,然后在合适的时间触发合适的事件,用合适的方法注册。

您可以创建一个委托列表,但是当您想要具有不同参数集的不同功能时,它会开始变得复杂。

于 2013-07-29T08:31:01.513 回答