c# - 使另一个类中的方法在完成后调用调用类中的事件?

标签 c# events windows-phone-7 delegates

我需要开始下载一些 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/

相关文章:

windows-phone-7 - 微软广告平台以外应用程序的最佳广告平台

windows-phone-7 - Windows Phone - 使用自定义图像从后台代理更新动态磁贴

c# - 从 C# 代码调用 dll 函数期间出错

c# - C# 与 Delphi 中日期/时间计算之间的差异

ruby - 如何为 TkToplevel 窗口绑定(bind) Destroy 事件?

java - RCP E4 @UIEventTopic 未调用

c# - ObjectContext 的 SetTransactionHandler

c# - 访问冲突读取位置 0x0000000c

c# - 在 C# 中,事件参数是按引用还是按值传递的?

windows-phone-7 - Windows Phone 目前是否有用于接近和光传感器的 API?