多个匿名事件处理程序 - 但只调用最后一个

时间:2011-02-09 13:27:49

标签: c# .net events

我有以下代码用于同时模拟实时数据馈送 发送一条消息,“Portfolio.Symbols”内的集合中的每个“Symbol”类型的对象都应该响应(通过另一种方法对其进行一些处理)。

为了使它同时成立,我尝试以下列方式注册匿名事件处理程序:

static public void RegisterEvents()
{
   foreach (Symbol symbol in Portfolio.Symbols)
   {
      GenerateQuoteRequest += () => { SomeMethod(symbol); };
   }
}

static public void Run()
{
   OnGenerateQuoteRequest();
   Thread.Sleep(100);
}

public delegate void OnGenerateQuoteRequestEventHandler();     
public static event OnGenerateQuoteRequestEventHandler GenerateQuoteRequest 
                                            = delegate {};
...

然后我尝试提升事件,希望我会启动一些“SomeMethod”实例。不幸的是,只添加了最后添加的“符号”。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:10)

臭名昭着的捕获变量/ foreach故障;尝试:

foreach (Symbol symbol in Portfolio.Symbols)
{
     var copy = symbol;
     GenerateQuoteRequest += () => { SomeMethod(copy); };
}

和btw;静态event真的危险 - 这些事件订阅不会取消订阅,因此您可能会在内存中不必要地保留大量内容。你可以使自我取消订阅,当然:

foreach (Symbol symbol in Portfolio.Symbols)
{
     var copy = symbol;
     OnGenerateQuoteRequestEventHandler handler = null;
     handler = () => {
         SomeMethod(copy);
         GenerateQuoteRequest -= handler;
     };
     GenerateQuoteRequest += handler;
}