Несколько анонимных обработчиков событий - но вызывается только последний - PullRequest
4 голосов
/ 09 февраля 2011

У меня есть следующий код, который я использую для имитации живого потока данных, который одновременно отправляет сообщение, на которое должен ответить каждый объект типа «Символ» в коллекции внутри «Portfolio.Symbols» (другим методом, выполняющим некоторую работу над ним).

Для того, чтобы это было одновременно, я пытаюсь зарегистрировать анонимные обработчики событий следующим образом:

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 Ответ

10 голосов
/ 09 февраля 2011

печально известная ошибка-захваченная переменная / foreach;попробуйте:

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

и кстати;статические event s действительно опасны - эти подписки на события сами по себе не отписываются, так что вы можете хранить много вещей в памяти без необходимости.Вы можете сделать их самостоятельно отписавшимися, конечно:

foreach (Symbol symbol in Portfolio.Symbols)
{
     var copy = symbol;
     OnGenerateQuoteRequestEventHandler handler = null;
     handler = () => {
         SomeMethod(copy);
         GenerateQuoteRequest -= handler;
     };
     GenerateQuoteRequest += handler;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...