从长期的事件源取消订阅表单组件 - 何时? [英] Unsubscribing Forms components from long-lived event sources - when?
问题描述
界面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 Dispose
d 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屋!