我要唤回我的记忆!我怎样才能真正处理控件?我有一个正在制作的应用程序,它创建了许多窗口控件(按钮和标签等)。它们都是由函数动态生成的。我遇到的问题是,当我删除控件并处理它们时,它们并没有从内存中删除。voidloadALoadOfStuff(){while(tabControlToClear.Controls.Count>0)tabControlToClear.Controls[0].Dispose();//我什至输入:GC.Collect();GC.WaitForPendingFinalizers();foreach(globalList中的字符串页面名称)tabControlToClear.Controls.Add(MakeATab(pagename));}TabPageMakeATab(stringtabText){TabPagenewT=newMakeATab();newT.Text=tabText;//用这样的方法用控件填充页面returnnewT;现在出于某种原因,这不会给我内存,所以当进程运行5次时,我最终会遇到内存不足的情况。我是对象和控制处置的新手,但浏览庞大的网络仍然没有给我任何方向,所以如果你们有任何想法,我很乐意听到。更新:我一直在观察用户对象(taskmanager)的创建和销毁,并注意到我创建了一个选项卡,添加了一个点击处理程序,添加了一个面板,添加了两个按钮,包括点击处理程序、工具提示和背景图像(我认为这就是问题所在)。该应用程序说它创建了8个新项目,但是当我运行处理时,我只从内存中删除了4个。我一直在尝试删除事件处理程序,但它似乎没有任何区别。解决!!!当我向面板添加新项目时,我会向它们传递一个工具提示(愚蠢,但我正在学习)。对于任何有同样问题的人,(感谢下面的人的评论和指点。我发现,为了使控件实际处理(因为我意识到我错了),是:1:如果您有工具提示,请确保它可以访问!不要做我想做的事!示例:这是错误的!TabPageMakeATab(stringtabText){TabPagenewT=newMakeATab();工具提示myTip=newToolTip();newT.Text=tabText;//使用像这样的方法用控件填充页面myTip.SetToolTip(newT,"Somethingtosay");返回新T;如果这样做,您将丢失指向工具提示的指针,并且由于工具提示不是它附加到的对象的子对象(相反,工具提示强烈引用控件),那么即使您销毁控件,工具提示您无权使对象保持活动状态。2:首先,调用toolTip.RemoveAll()。这将删除它与控件的所有联系。请注意,如果您将此提示用于其他控件,它们只会丢失工具提示。3:从基础control.ControlCollection中删除任何内部控件(如果它们使用非托管内存,我猜。我这样做是因为它使我的应用程序工作...)4:删除任何自定义事件处理程序。5:最后,配置对象。我做了一个快速递归函数,它做得很好。privatevoidRecursiveDispose(ControltoDispose){while(toDispose.Controls.Count>0)RecursiveDispose(toDispose.Controls[0]);如果(toDispose.BackgroundImage!=null)BackgroundImage=null;if(toDispose.GetType()==typeof(Button))toDispose.Click-=[你的事件];elseif(toDispose.GetType()==typeof(TabPage))toDispose.DoubleClick-=[你的事件];elseif(toDispose.GetType()==typeof(Label))toDispose.MouseMove-=[你的事件];toDispose.Dispose();这是相当粗糙的,可能有更好的方法,但除非有人能弄清楚,否则必须这样做。感谢大家的帮助。您可能刚刚保存了我的整个项目。您还需要清除引用。while(tabControlToClear.Controls.Count>0){vartabPage=tabControlToClear.Controls[0];tabControlToClear.Controls.RemoveAt(0);tabPage.Dispose();//清除events.foreach(EventHandlersubscriberintabPage.Click.GetInvocationList()){tabPage.Click-=subscriber;在此代码块中,您正在调用Dispose但不删除引用:while(tabControlToClear.Controls.Count>0)tabControlToClear.Controls[0].Dispose();您需要删除对该控件的所有引用(在Controls集合中加上任何已注册的事件处理程序和您可能拥有的任何其他引用)以使该控件符合垃圾回收条件。voidloadALoadOfStuff(){while(tabControlToClear.Controls.Count>0)tabControlToClear.Controls[0].Dispose();//我什至输入:GC.Collect();GC.WaitForPendingFinalizers();foreach(globalList中的字符串页面名称)tabControlToClear.Controls.Add(MakeATab(pagename));在我看来,您正在测试方法末尾重新分配所有选项卡实例,因此首先处理它们显然没有任何好处。跳过最后两行,看看是否有帮助。到目前为止,这个问题有很多很好的答案,提到一个可能的原因是对象没有被释放,它们都值得检查。然而,当我遇到这类问题时,我使用内存分析器来帮助跟踪对对象的引用,而上次我查看内存分析器时,ANTSMemoryProfiler(来自RedGate)是最好的之一。(他们做一个14天的尾巴,足够长来调查像这样的单个问题。)这是使用弱事件模式的原因之一,但这将是一个全新的问题。(动态修改UI时,UI对象的生命周期是个雷区,请检查taskmanager,确保你的代码按预期运行)以上是C#学习教程:我要回忆一下!我怎样才能真正处理控件?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
