Tag: memory

为什么处理一个肯定会很快被处理掉的物体呢?

假设我有一个例如点击按钮的程序。 我创建了一个Graphics对象。 显然我应该处理它,例如 using(Graphics gr__=this.CreateGraphics()) { } 或者在try-catch-finally的finally中调用.Dispose() 。 但考虑到程序将很快结束。 假设我在程序的本地创建它(不是全局的,不是在使用中)。 但是当地的程序。 然后肯定像任何其他变量一样,它会在程序完成后自动处理掉,不是吗? 那么为什么我手动/明确地处理它很重要? 为什么我不能像任何其他变量一样自动垃圾收集? 当然它可能比’int’大一点,但它可能仍然很小,并且不会长时间记忆,因为程序结束如此之快。 甚至可能是在完成使用或调用Dispose() ,程序结束,因此我认为如果变量是程序的本地变量,它将被处理掉。 那么为什么要使用Dispose() / using的显式垃圾收集呢?

事务范围类似的function

我希望设置一些非常类似于事务范围的东西,它在服务上创建一个版本,并在范围的末尾删除/提交。 在事务范围内运行的每个SQL语句在内部查看某个连接池/事务存储,以确定它是否在范围内并做出适当的反应。 呼叫者不需要将事务传递给每个呼叫。 我正在寻找这个function。 这里有一点关于它: https : //blogs.msdn.microsoft.com/florinlazar/2005/04/19/transaction-current-and-ambient-transactions/ 这是基本的一次性课程: public sealed class VersionScope : IDisposable { private readonly GeodatabaseVersion _version; private readonly VersionManager _versionManager; public VersionScope(Configuration config) { _versionManager = new VersionManager(config); _version = _versionManager.GenerateTempVersion(); _versionManager.Create(_version); _versionManager.VerifyValidVersion(_version); _versionManager.ServiceReconcilePull(); _versionManager.ReconcilePull(_version); } public void Dispose() { _versionManager.Delete(_version); } public void Complete() { _versionManager.ReconcilePush(_version); } } 我希望到目前为止我编写的所有代码的能力都没有任何版本的概念。 我只想包括一个简单的 […]

具有IDisposable且没有IDisposable的内存释放

在我的应用程序中,我有一个大的对象,每隔几秒就创建一次,我做了一些工作然后我不再需要它了。 我在任务管理器中看到,即使我没有对象的ant引用,ram大小也会上升,并且需要收集它。 我试图实现IDisposable,然后ram不断下降。 为什么是这样? 我不做GC.Collect我只是释放对象并告诉GC他不需要为我的对象调用终结器? 更新 这是我在IDIsposable对象中使用的代码: public void Dispose() { base.Dispose(); Dispoe(true); GC.SuppressFinalize(); } private void Dispoe(bool disposing) { //here i release unmanaged resources if (disposing) { //here i release all managed resources } } ~MyObject() { Dispose(false); } 在我的大对象中,我做了myObject.Dispose(); 在我不再需要他之后。 我的问题不是关于如何实现IDisposable,而是关于GC代的工作。 我只是想知道如何可能的情况之间的公羊大小差异的情况我做Dispoe我的对象情况我不会Dispoe我的对象。

c#double to character array或alternative

我有一个程序存储一堆结构实例,其中包含许多double类型的成员。 我经常将这些转储到一个文件,我正在使用字符串构建器,例如: StringBuilder builder = new StringBuilder(256); builder.AppendFormat(“{0};{1};{2};”, xAToString(), xBToString(), xCToString()); 其中’x’是我的类型的实例,A,B,C是double类型的X的成员。 我在每个上面调用ToString()以避免装箱。 但是,这些对ToString的调用仍然在我的应用程序的上下文中分配了大量内存,我想减少这一点。 我的想法是拥有一个字符数组,并将每个成员直接写入该数组,然后从该字符数组创建一个字符串并将其转储到该文件中。 几个问题: 1)我想做的事情听起来合理吗? 有没有人知道会有类似的东西? 2)是否已经内置了将double转换为字符数组(我想这将达到一些参数化精度?)。 理想情况下想要传入我的数组和一些索引并让它开始写入那里。 我试图这样做的原因是当我的应用程序运行时减少内存中的大量峰值,因为我运行了很多实例并经常发现自己受内存限制。 干杯A.

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

我有一个我正在制作的应用程序,它创建了大量的窗口控件(按钮和标签等)。 它们都是通过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垃圾收集行为(使用DataTable obj)

我想知道为什么在创建一个非常简单的DataTable然后将其设置为null后,垃圾收集不会清除该DataTable使用的所有内存。 这是一个例子。 变量Before应该等于Removed但它不是。 { long Before = 0, After = 0, Removed = 0, Collected = 0; Before = GC.GetTotalMemory(true); DataTable dt = GetSomeDataTableFromSql(); After = GC.GetTotalMemory(true); dt = null; Removed = GC.GetTotalMemory(true); GC.Collect(); Collected = GC.GetTotalMemory(true); } 给出以下结果。 Before = 388116 After = 731248 Removed = 530176 Collected = 530176

读取tiff文件的尺寸和分辨率,而不先加载它

如何在不首先使用如下代码将内容加载到内存中的情况下读取tiff文件的尺寸(宽度和高度)和分辨率(水平和垂直)。 它对于大文件来说太慢了,我不需要操纵它们。 Image tif = Image.FromFile(@”C:\large_size.tif”); float width = tif.PhysicalDimension.Width; float height = tif.PhysicalDimension.Height; float hresolution = tif.HorizontalResolution; float vresolution = tif.VerticalResolution; tif.Dispose(); 编辑: 那些tiff文件是Bilevel,尺寸为30×42英寸。 文件大小约为1~2 MB。 所以上面的方法工作正常但速度慢。

C#对象引用如何在内存中/运行时(在CLR中)表示?

我很想知道C#对象引用如何在运行时(在.NET CLR中)在内存中表示。 想到的一些问题是: 对象引用占用多少内存? 在类的范围和方法的范围中定义时它是否不同? 根据此范围(堆栈与堆),它所在的位置是否不同? 对象引用中维护的实际数据是什么? 它只是一个指向它引用的对象的内存地址还是有更多的内存地址? 这是否根据是否在类或方法的范围内定义而有所不同? 与上述问题相同,但这次是在讨论对引用的引用时,例如在通过引用将对象引用传递给方法时。 1和2的答案如何变化?

追踪内存泄漏(C#)的最佳方法仅在一个客户的盒子上可见

追踪只能在一个客户的测试/发布盒中找到的内存泄漏的最佳方法是什么,而在其他地方没有?

从内存运行可执行文件

我正在尝试直接从此可执行文件的byte []表示中运行可执行文件作为C#中的资源。 所以基本上我想直接运行PE的byte []而不需要触摸硬盘。 我正在使用的代码曾经用于工作但它不再存在。 代码创建一个具有冻结主线程的进程,更改整个进程数据并最终恢复它,以便它运行PE的byte []。 但是如果线程恢复,似乎进程就会死掉,我真的不知道什么是错的。 所以这里是一个pastebin中的代码,因为它太长了我猜… http://pastebin.com/18hfFvHm 编辑: 我想运行非托管代码! 任何PE文件……