本地范围内具有事件处理程序的GDI对象

时间:2017-12-19 13:36:24

标签: c# multithreading gdi

我有一个简短的问题,我无法在其他地方找到答案。

我们有一个大型的4.0桌面应用程序(想想3个解决方案中的大约100个项目),它们遇到了10k + GDI对象问题。显然我们在某个地方有泄漏。我最近一直在进行很多测试,以确切地找出可能存在的问题。其中一些是.NET,例如,一个TabControl的每个新实例,即使是处置,似乎留下一个GDI对象(每个打开/关闭的形式从79个对象增加到80个,然后是81个,然后是82个,等等。)但显然我们的用户不是每天打开带有标签控件的表单10,000次。

在我的问题上:我是否必须为本地范围代码发布事件处理程序,如下所示:

            UserLoginManager loginManager = new UserLoginManager();
            loginManager.LoginFailed += HandleFailedLogin;
            loginManager.LoginSuccessful += HandleSuccessfulLogin;

            loginManager.LogUserInAsync(this.UserNameTextBox.Text.Trim(), this.PasswordTextBox.Text.Trim());

我问这个是因为如果事件处理程序分配给一个在应用程序生命周期内保持打开状态的表单,我不确定该对象是否正确GC。< / p>

1 个答案:

答案 0 :(得分:0)

GC仅在一个方向上追踪引用。您注册的事件处理程序委托将具有对表单的引用(如果它们是实例方法),并且事件本身保存对委托的引用。但是,如果没有任何内容持有对UserLoginManager的引用,则它将有资格进行收集,并且它(传递)持有的引用将不会使其他对象保持活动状态。

事件处理程序和泄漏的风险是相反的方式 - 如果你有一个长期存在事件的对象,并且你有想要的对象是短暂的 - 如果那些“应该是短暂的“对象注册事件处理程序,并且