我有以下代码用于同时模拟实时数据馈送 发送一条消息,“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”实例。不幸的是,只添加了最后添加的“符号”。
我在这里缺少什么?
答案 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;
}