Tag: dispose

我想要回忆我的记忆! 我怎样才能真正处置控件?

我有一个我正在制作的应用程序,它创建了大量的窗口控件(按钮和标签等)。 它们都是通过function动态制作的。 我遇到的问题是,当我删除控件并处理它们时,它们不会从内存中删除。 void loadALoadOfStuff() { while(tabControlToClear.Controls.Count > 0) tabControlToClear.Controls[0].Dispose(); //I even put in: GC.Collect(); GC.WaitForPendingFinalizers(); foreach(String pagename in globalList) tabControlToClear.Controls.Add(MakeATab(pagename)); } TabPage MakeATab(string tabText) { TabPage newT = new MakeATab(); newT.Text = tabText; //Fill page with controls with methods like this return newT; } 现在由于某种原因,这只是没有给我回忆,所以当进程运行5次时,我最终会出现内存不足的情况。 我是对象和控制处置的新手,但是通过庞大的网络仍然没有给我任何指示,所以如果你们有任何想法,我会很高兴听到它。 更新:我一直在观察用户对象的创建和销毁(taskmanager),并注意到我创建了一个标签页,添加了一个单击处理程序,添加了一个面板,添加了两个按钮,包括点击处理程序,工具提示和背景图像(我认为这是哪里问题是)。 该应用程序说它创建了8个新项目,但是当我运行我的处理时,我只从内存中删除4个。 我一直试图删除事件处理程序,但它似乎没有任何区别。 解决!!! 当我向面板添加新项目时,我向他们传递了一个工具提示(愚蠢,但我正在学习)。 对于任何有同样问题的人,(感谢下面的人的评论和指示。我发现,为了使控件真正处置(因为我意识到我错误地把它),是: 1:如果你有工具提示,请确认它是可以访问的! 不要做我想做的事! […]

有趣的事件“处置”行为

我注意到我们的.NET WinForms应用程序中有趣的行为。 我们有一个mdi表单,添加了许多mdi子项。 这些子forms听取“广播”事件,这实际上是一种刷新自己的呼叫。 事件在基类中声明,并在子表单中添加侦听事件。 我注意到,即使这些子窗体关闭,如果在Dispose()方法中没有显式删除事件,事件仍然会被命中。 这背后的原因是什么? 当然,如果表格被关闭,事件应该分开/处理? 是因为实际事件本身是在外部类中声明的吗? 这就是我的假设。 洞察力将非常感激。 (使用C#,.NET 3.5)

在包装Interop COM对象时,如何在c#中实现dispose模式?

我的类包含来自Interop的对象,并在其上调用一个方法,使其分配内容。 它还公开了一个释放这些东西的方法,所以我希望我应该在Dispose()中调用它: class MyClass : IDisposable { private DllName.ComClassName comInstance; void SomeMethod() { comInstance = new DllName.ComClassName(); comInstance.AllocStuff(); } public void Dispose() { comInstance.FreeThatStuff(); } } 现在,我应该扩展所有这些以遵循Dispose模式。 我没有其他一次性或非托管资源可以发布,所以假设comInstance被管理(不是Interop所做的那样,将非托管包装到托管?),我认为该模式解决了: public void Dispose() { if (comInstance != null) { comInstance.FreeStuff(); comInstance = null; } } 哪个泄漏除非我在MyClass的实例上显式调用Dispose(),这会使Dispose模式有缺陷? 这是否意味着comInstance必须是非托管的,并且模式解析为: public void Dispose() { DisposeComInstance(); GC.SuppressFinalize(this); } ~MyClass() { DisposeComInstance(); […]

在Singleton上使用Dispose来清理资源

我的问题可能更多地与语义有关,而不是与IDisposable的实际使用有关。 我正在实现一个单例类,负责管理在执行应用程序期间创建的数据库实例。 应用程序关闭时,应删除此数据库。 现在我将删除操作由应用程序在关闭时调用的单例的Cleanup()方法处理。 当我编写Cleanup()的文档时,让我感到震惊的是我正在描述应该使用Dispose()方法来清理资源。 我原本没有实现IDisposable因为它在我的单身中看起来不合适,因为我不想要任何东西来处理单身本身。 目前还没有,但将来可能会出现这样一个原因:可能会调用此Cleanup()但单例仍然需要存在。 我想我可以包含GC.SuppressFinalize(this); 在Dispose方法中使这个可行。 因此,我的问题是多方面的: 1)在单例上实现IDisposable从根本上说是一个坏主意吗? 2)我只是通过使用Cleanup()而不是Dispose()来混合语义,因为我正在处理资源我真的应该使用dispose吗? 3)用GC.SuppressFinalize(this);实现’Dispose()’ GC.SuppressFinalize(this); 这样我的单身实际上并没有被破坏,因为我希望它在调用清理数据库后生存。

我是否应该打扰处理共享进程生命周期的对象?

我知道实现IDisposable所有对象应该在不再需要时立即处理,以释放其非托管资源使用的内存。 我的问题涉及我知道的事实,直到主机进程本身终止为止。 如果我处理它们会不会有任何区别? 当进程死亡时,是否存在释放内存的可能性? GDI对象怎么样? 即使没有处理过程,GDI句柄是否会在进程终止时被释放? 我完全明白,无论如何处理所有物体都是一种好习惯。 纯粹是出于好奇而问我。

Ninject和DataContext处理

我正在使用Ninject从内核中检索我的DataContext,我想知道Ninject是否自动处理DataContext,或者他如何处理dispose()行为。 根据自己的经验,我知道处理datacontext非常重要,每当你创建DataContext的直接对象时(如:new DataContext()),你应该使用using()块。 我的问题是:当我从内核检索我的DataContext时,我是否仍然必须使用using()块? 或者Ninject是否为我解决了这个问题?

有没有办法动态创建和处理Webbrowser控件?

我有这个使用Webbrowser控件进行自动浏览的应用程序。 我需要想出一种方法来自动关闭浏览器(dispose),然后创建另一个实际工作的实例。 这是我到目前为止的一些代码。 this.webBrowser2 = new System.Windows.Forms.WebBrowser(); this.webBrowser2.Dock = System.Windows.Forms.DockStyle.Bottom; this.webBrowser2.Location = new System.Drawing.Point(0, 34); this.webBrowser2.MinimumSize = new System.Drawing.Size(20, 20); this.webBrowser2.Name = “webBrowser2”; this.webBrowser2.ScriptErrorsSuppressed = true; this.webBrowser2.Size = new System.Drawing.Size(616, 447); this.webBrowser2.TabIndex = 1; 所以我在考虑是否处理了webbrower实例。 webBrowser2.dispose(); 然后创建webbrowser对象的新实例。 WebBrowser w = new WebBroswer(); w.Navigate(url); 不幸的是,这不起作用。 浏览器的新实例未显示,并且已处置的浏览器对象在Windows窗体中保持冻结状态。 有什么我做错了吗? 谢谢

如何正确管理DataContext的处理?

我有一个非常重的数据库访问的Web服务。 它在测试中运行良好,但是一旦我将它投入生产并加速加载,它就会开始产生在DataContext中调用某个方法时引发的错误。 错误通常是以下之一: 你调用的对象是空的 无法访问已处置的对象。 对象名:’Dispose后访问的DataContext。’。 但不总是。 任何单个Web服务请求都可能导致多达10或15个数据库查询以及1或2个更新。 我设计了一个带有数据访问层的应用程序,这是一组对象,表示我的数据库中包含所有业务逻辑的表。 这是我的Web服务的一个单独项目,因为它与Web GUI共享。 数据访问对象派生自一个基类,该基类具有GetDataContext()方法,可在需要时启动数据上下文的实例。 我写的所有数据访问对象都是: using (db = GetDataContext()) { // do some stuff } 为每个数据库交互愉快地创建/使用/处置我的DataContext(由sqlmetal.exe创建)对象。 经过几个小时的搔抓,我想我已经确定我的错误的原因是在加载时datacontext对象被创建和处理的方式太多了,我需要更改东西以共享相同的datacontext持续时间Web服务请求。 我发现这篇文章在互联网上有一个DataContextFactory,似乎完全符合我的需要。 但是,现在我已经实现了这个,并且DataContext被保存为HttpContext中的一个项目,我得到… 无法访问已处置的对象。 对象名:’Dispose后访问的DataContext。’ …每当我的datacontext被多次使用时。 这是因为我的use using (…) {}代码在首次使用后处理我的datacontext。 所以,我的问题是……在我浏览整个数据访问层并删除大量使用usings ,这样做的正确方法是什么? 我不想通过取出使用来导致内存泄漏,但同时我想在不同的数据访问对象之间共享我的datacontext。 我应该只是删除使用,并在我从Web服务请求返回之前手动调用dispose方法吗? 如果是这样,我怎么去确保我捕捉到所有的东西,记住我有几个可能变得凌乱的try-catch块。 还有另一种更好的方法吗? 我应该忘记处理并希望一切都被隐瞒了吗? UPDATE 问题似乎不是性能问题……请求处理非常快,不超过200毫秒。 事实上,我已经通过生成大量虚假请求进行负载测试而没有任何问题。 据我所知,它与负载有关的原因有两个: 大量请求会导致并发请求相互影响 问题更频繁地发生,因为有很多请求。 当问题确实发生时,应用程序池将进入错误状态,并需要循环才能使其再次运行。

处理问题

我有许多类具有实现IDisposable(定时器,画笔等)的私有成员变量。 我是否需要做任何事情以确保.NET Framework正确清理这些变量? 我遇到的文献是指“托管资源”与“非托管资源”。 这些术语让我感到困惑,因为您可以拥有一个使用非托管资源实现function的托管类。 这被视为“非托管资源”还是“托管资源”? 我的理解是,如果您没有在实现IDisposable的对象上调用Dispose(),那么在应用程序退出之前不会释放资源。 在长时间运行程序时,这种情况可能会导致OutOfMemoryexception。 如何确保我的代码正确处理资源管理? 这对于这些对象很重要,因为它们是自定义控件,并且可能有很多绘图消耗了IDisposable资源。 我尽可能使用C#using语句,但有时我需要使一个对象实现IDisposable一个成员变量,而using语句对我没有帮助。

使用entity framework使用存储库和单元工作模式正确处置?

干杯!我对使用工作单元和存储库有些怀疑。 特别是来自Entity Framework的子上下文的角色。 我已经搜索了很多关于这个主题的信息,但是我发现只是不同类型的使用模式,我很困惑,我无法理解主要思考。 1.我应该在哪里实现处置和储蓄? – 它是否在DbContext的inheritance类中正确实现了Disposable? 之后在存储库和工作单元中实现还是只在Uni fo工作中实现? – 把方法保存在工作单元或存储库中? 我的存储库将是Generic我的代码在架构师风格和其他细节方面是否正确?请告诉我的想法是否错误。 interface IRepository : IDisposable { void Create(); void Delete(); void Update(); void Get(); T getSomeByExpression() …Some another costum operations …should I remember about Save here? } class Repository : IRepository { SomeContext context = new SomeContext(); …Using using(context = new SomeContext()){} in functions?? […]