我有以下代码用于模拟实时数据源,它同时发送一条消息,"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)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |