我有一个对象,在启动时,从服务器请求一些信息。它发送一个带有消息的标识符,该消息在回复中是相同的,因此可以确定它正在响应正确的消息。目前,代码看起来大致如此。
void GetInitialData()
{
string guid = Guid.NewGuid().ToString();
Communicator.NewMessage += (sender, e)
{
if(e.Message.Id == guid)
FillInfo();
};
Communicator.SendMessage(new Message(stuff, guid));
}
这是有效的,但由于这个数据只需要一次,我想取消订阅之后的事件,你不能用lambda做。如果我使用单独的函数,这允许我取消订阅,但似乎将参数传递给函数的唯一方法是通过类变量。
string guid;
void GetInitialData()
{
Communicator.NewMessage += MessageReceived;
Communicator.SendMessage(new Message(stuff, guid));
}
void MessageReceived(object sender, MessageArgs e)
{
if(e.Message.Id == guid)
{
FillInfo();
Communicator.NewMessage -= MessageReceived;
}
}
有没有办法让我取消订阅并避免使用额外的变量使课程变得混乱?
答案 0 :(得分:4)
首先将lambda存储在变量中时,可以取消注册lambda:
void GetInitialData()
{
EventHandler<EventArgs> handler = null;
handler = (sender, e) =>
{
if(e.Message.Id == guid)
{
FillInfo();
Communicator.NewMessage -= handler;
}
};
string guid = Guid.NewGuid().ToString();
Communicator.NewMessage += handler;;
Communicator.SendMessage(new Message(stuff, guid));
}