从长期的事件源取消订阅表单组件 - 何时? [英] Unsubscribing Forms components from long-lived event sources - when?

查看:124
本文介绍了从长期的事件源取消订阅表单组件 - 何时?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个.NET 1.1。应用程序通过定制的翻译系统提供字符串资源,看起来像这样:

 界面ITranslationProvider 
{
string GetTranslation(string key);
event LanguageChangedEvent LanguageChanged;
}

ie:语言可以在运行时更改,组件需要通过更新显示来响应字符串。



单个翻译提供者持续应用程序的生命周期,而消耗翻译服务的Windows窗体组件可以动态创建。如果我使用这个表单组件,什么时候取消订阅 LanguageChanged 事件的正确时间?



例如,似乎覆盖 Dispose()应该工作:

  class MyPanel:System.Windows.Forms.Panel 
{
public MyPanel(ITranslationProvider translator)
{
this.translator = translator;
translator.LanguageChanged + = new LanguageChangedEvent(SetText);
SetText();
}

protected override void Dispose(bool disposal)
{
base.Dispose(disposal);

//这是取消注册的正确位置?在此面板上将Dispose()get
//调用,即使翻译器的事件有
//对它的引用?
translator.LanguageChanged - = new LanguageChangedEvent(SetText);
}

private void SetText()
{
this.Text = translator.GetTranslation(my.panel.text);
}

私人ITranslationProvider翻译器;
}

...但是我找不到一个确定的答案,安全还是不安全有任何想法吗?

解决方案

您的控制将是处理其/



如果您通过调用 Show()来显示表单,则.Net将在关闭时自动处理。

如果您调用 ShowDialog(),则您有责任处理表单,大概在中使用块。 (在任何情况下都应该处理表单,即使不添加事件处理程序)


I have a .NET 1.1. application which provides string resources through a bespoke translation system that looks a little like this:

interface ITranslationProvider 
{
    string GetTranslation(string key);
    event LanguageChangedEvent LanguageChanged;
}

ie: language can change at runtime, and components need to respond by updating display strings.

A single translation provider lasts the lifetime of the application, whereas Windows Forms components that consume translation services get created dynamically. If I write forms components that use this, when is the correct time to unsubscribe from the LanguageChanged event?

for example, it seems like overriding Disposing() should work:

class MyPanel : System.Windows.Forms.Panel 
{
    public MyPanel(ITranslationProvider translator) 
    {
        this.translator = translator;
        translator.LanguageChanged += new LanguageChangedEvent(SetText);
        SetText();
    }

    protected override void Dispose(bool disposing) 
    {
        base.Dispose(disposing);

        // is this the correct place to unregister? will Dispose() get 
        // called on this panel, even though the translator's event has 
        // a reference to it?
        translator.LanguageChanged -= new LanguageChangedEvent(SetText);
    }

    private void SetText() 
    {
        this.Text = translator.GetTranslation("my.panel.text");
    }

    private ITranslationProvider translator;
}

... but I can't find a definitive answer to whether this is safe or not. Any ideas?

解决方案

Your control will be Disposed when its parent form is disposed.

If you show the form by calling Show(), .Net will automatically dispose it when it's closed.
If you call ShowDialog(), you are responsible for disposing the form, presumably in a using block. (You should dispose the form in any case, even if it doesn't add event handlers)

这篇关于从长期的事件源取消订阅表单组件 - 何时?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆