我需要开始下载一些 html,所以我在另一个类中调用了 void GetHTML。完成后,我想传递它应该在调用类中引发的事件。我怎么能这样做?
所以它看起来像这样:
public class Stuff
{
public void GetHTML(string url, event to raise here)
{
//Do stuff then raise event
}
}
public class Other
{
public Other()
{
Stuff stuff = new Stuff();
stuff.GetHTML(someUrl, somehow sending info that HTML_Done should be called);
}
void HTML_Done(string result, Event e)
{
//Do stuff with the result since it's done
}
}
我意识到我不是很清楚我想做什么,我很乐意填补任何遗漏的部分。
感谢您的任何建议!
最佳答案
Event Subscription and Notification
public class Stuff
{
// Public Event to allow other classes to subscribe to.
public event EventHandler GetHtmlDone = delegate { };
public void GetHTML(string url)
{
//Do stuff
// Raise Event, which triggers all method subscribed to it!
this.GetHtmlDone(this, new EventArgs());
}
}
public class Other
{
public Other()
{
Stuff stuff = new Stuff();
// Subscribe to the event.
stuff.GetHtmlDone += new EventHandler(OnGetHtmlDone);
// Execute
stuff.GetHTML("someUrl");
}
void OnGetHtmlDone(object sender, EventArgs e)
{
//Do stuff with the result since it's done
}
}
使用这种模式允许更多的订阅者。
您也不要将通知程序 Stuff
类绑定(bind)到调用方 Other
类。
您要么有订阅者,要么没有订阅者,这与 Stuff
类没有区别。
Stuff
类不应该知道订阅者,它应该只是引发一个它为订阅公开的事件。
编辑
正如 ctacke 在评论中正确指出的那样,如果没有人订阅,使用 this.GetHtmlDone(this, new EventArgs());
引发事件将导致异常。
我更改了上面的代码,以确保可以通过初始化事件处理程序始终安全地引发事件。
因为我一直在使用它(通过提高它),所以我确信始终初始化您正在使用的东西是唯一的好习惯。
我可以在事件处理程序上添加空检查,但在我个人看来,我不同意必须由 stuff
类负责。我觉得应该始终提出该事件,因为这是“负责任”的事情。
我找到了这个 thread在 SO 上,哪种方式向我证实这样做似乎没有错。
此外,我还对该代码运行代码分析,以确保我不会通过初始化 EventHandler 来破坏 CA1805 规则。没有提出 CA1805,也没有违反任何规则。
使用我在评论中的汽车类比,我相信不初始化事件处理程序并一直提升它与说“当你的车转弯时只在有人在看时使用你的指示器,如果没有人在看,则不要使用”是一样的。不要打扰”。你永远不知道是否有人在看,所以你不妨确保你总是这样做。
这只是我个人的喜好。任何其他人,如果您喜欢这样做,请始终添加 != null 检查。
非常感谢您的评论 ctacke 并指出这一点。我从中学到了很多东西。
我现在必须回到我的一些项目并更新一些代码,以确保如果没有人订阅我的事件,我的库不会崩溃。在我的任何测试中都没有发现这一点,我感到很愚蠢。
关于c# - 使另一个类中的方法在完成后调用调用类中的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201257/