了解传入消息的事件处理

时间:2017-02-13 00:00:06

标签: c# events interactive-brokers

我正在尝试从他们的API中了解Interactive Brokers示例中的一部分代码。它是关于处理来自传入消息的数据,虽然我理解事件处理的一般流程,但我不明白这一部分:

ibClient.ScannerData += (reqId, rank, contractDetails, distance, benchmark, projection, legsStr) => 
    HandleMessage(new ScannerMessage(reqId, rank, contractDetails, distance, benchmark, projection, legsStr));

这行代码中发生了什么? 我理解更宏大的方案中发生了什么,但不了解{{1}发生了什么}

ibClient.ScannerData += ([params]) => f(g([params]))方法负责显然处理传入的消息,并且由于这行代码只运行一次,我相信这告诉HandleMessage信息如何处理ibClient.ScannerData信息被发送到ScannerData

这是ibClient在后​​端看起来的样子 -

ibClient

public event Action<int, int, ContractDetails, string, string, string, string> ScannerData; void EWrapper.scannerData(int reqId, int rank, ContractDetails contractDetails, string distance, string benchmark, string projection, string legsStr) { var tmp = ScannerData; if (tmp != null) tmp(reqId, rank, contractDetails, distance, benchmark, projection, legsStr); } 的位置 -

EWrapper.scannerData
     

提供市场扫描仪产生的数据   请求。

2 个答案:

答案 0 :(得分:2)

这基本上是为事件分配事件处理程序。让我们看一个更简单的示例,其中参数越少,以帮助澄清混淆。如果你查看Button类,它有一个click事件,事件的签名是这样的:

public delegate void EventHandler(object sender, EventArgs e);

所以基本上要订阅按钮的Click事件,您需要一个采用objectEventArgs的方法。所以要订阅它,你可以这样做:

button.Click += new EventHandler(Button_Click);

或者这个:

button.Click += (se, ev) => Button_Click(sender, e);

甚至简短,你可以这样做:

button.Click += Button_Click;

他们都在做同样的事情。他们说当按钮的Click事件被触发时,调用Button_Click方法。该方法如下所示:

private void Button_Click(object sender, EventArgs e)
{
    // code here
}

+=正在订阅,或者为Click事件添加处理程序。您可以根据需要添加任意数量。如果您想取消订阅或删除处理程序,请使用-=

在您的情况下,事件是这样的:

public event Action<int, int, ContractDetails, string, string, string, string> ScannerData;

所以说要订阅ScannerData事件,你需要一个需要7个参数的方法(2 int s,ContractDetails和4 string s) 。所以要订阅它,你这样做:

ibClient.ScannerData += (reqId, rank, contractDetails, distance, benchmark, projection, legsStr) => 
    HandleMessage(new ScannerMessage(reqId, rank, contractDetails, distance, benchmark, projection, legsStr));

Action代表:

  

封装具有单个参数且不返回值的方法。

在您的情况下,它是Action代表,其中包含更多参数。

这个=>是一个lambda表示法。基本上它可能是这样的:

this.ScannerData += new Action<int, int, ContractDetails, string, string, string, string>(
    HandleMessage
    (new ScannerMessage(reqId, rank, contractDetails, distance, 
                        benchmark, projection, legsStr));

您可以阅读this文章或google 活动hanlders with lambda 并且有很多文章。

答案 1 :(得分:0)

ibClient.ScannerData是一个事件列表。

这会在列表中添加一个新事件:

ibClient.ScannerData += (reqId, rank, contractDetails, distance, benchmark, projection, legsStr) => 
    HandleMessage(new ScannerMessage(reqId, rank, contractDetails, distance, benchmark, projection, legsStr));

这将获取事件列表,并调用所有已注册的事件:

var tmp = ScannerData;

if (tmp != null)
    tmp(reqId, rank, contractDetails, distance, benchmark, projection, legsStr);

找到关于+ =操作函数的一些解释:+= new EventHandler(Method) vs += Method