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

Sau*_*aul 4 .net c# 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 {};
...
Run Code Online (Sandbox Code Playgroud)

然后我尝试提升事件,希望我会得到一些"SomeMethod"实例启动.不幸的是,只调用了最后添加的"符号".

我在这里错过了什么?

Mar*_*ell 10

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

foreach (Symbol symbol in Portfolio.Symbols)
{
     var copy = symbol;
     GenerateQuoteRequest += () => { SomeMethod(copy); };
}
Run Code Online (Sandbox Code Playgroud)

和btw; 静态events 非常危险 - 这些事件订阅不会取消订阅,因此您可能会在内存中不必要地保留大量内容.当然,你可以他们自我取消订阅:

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