Tag: garbage collection

没有其他对象引用时,Timer对象是否得到GC?

如果没有其他对象引用它,是否可以对包含活动Timer( System.Timers.Timer )的对象进行垃圾回收?

拥有一次性田地的类型应该是一次性的。 怎么解决这个警告?

我尝试在VisualStudio 2012使用“运行代码分析”选项,因此我收到了警告 CA1001 Types that own disposable fields should be disposable Implement IDisposable on ‘DBConnectivity’ because it creates members of the following IDisposable types: ‘SqlConnection’, ‘SqlCommand’. 我在SO中提到了一些问题,但是我无法IDisposable和以下是该类,负责此警告。 class DBConnectivity { public SqlConnection connection = null; public SqlCommand command = null; public SqlDataReader dataReader = null; public string connectionString = null; public List masterTableList; public DBConnectivity() […]

为什么总是需要在具有IDisposable成员的对象上实现IDisposable?

据我所知,这是一个公认的规则,如果你有一个类A具有IDisposable成员m,A应该实现IDisposable,它应该调用它内部的m.Dispose()。 我找不到令人满意的理由,为什么会这样。 我理解规则如果你有非托管资源,你应该提供一个终结器和IDisposable,这样如果用户没有显式调用Dispose,终结器仍将在GC期间清理。 但是,根据该规则,您似乎不需要具有此问题的规则。 例如… 如果我有课: class MyImage{ private Image _img; … } 约定规定我应该有MyImage : IDisposable 。 但是如果Image遵循惯例并实现了终结器而我不关心资源的及时发布,那有什么意义呢? UPDATE 我在这里找到了一个很好的讨论。

任务和垃圾收集有什么问题?

在使用从任务并行库派生的API和类时,开发人员何时需要关注垃圾收集的影响? .NET Task实例在运行期间是否超出范围? ,似乎给人一种安全感,你不必担心将任务保持在范围内。 然而,问题似乎仅限于在ThreadPool上运行的任务,然后它们由ThreadPool rooted 。 但是,如果我正确理解这篇MSDN博客文章 ,那么SO问题的建议通常不适用,因为TaskCompletionSource中的任务不是类似的rooted 。 是否只关注TaskCompletionSource的直接使用时间? 但是,在使用API​​时,您不知道任务的来源。 如果提供的Task来自TaskCompletionSource或其他一些非根源,您是否需要担心存储对continuation的引用? 由于需要考虑任务是否已植根(Async I / O Tasks是否为root?),这似乎很快变得不方便和复杂。 我很难找到关于主题的信息,但它是一个很受欢迎的库,我觉得我不应该阅读反编译的源代码来确定我是否需要担心垃圾收集器的竞争条件,所以我想我必须是遗失或误解的东西。

blittable类型的非blittable错误

我有这个结构和这段代码: [StructLayout(LayoutKind.Sequential, Pack = 8)] private class xvid_image_t { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public int[] stride; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] // public IntPtr[] plane; } public int decore() { xvid_image_t myStruct = new xvid_image_t(); myStruct.stride = new int[4]; // can be commented out – same result GCHandle.Alloc(myStruct, GCHandleType.Pinned); // … } 当我尝试运行它时,我得到一个ArgumentException : 对象包含非原始或非blittable数据 […]

获取.NET对象的内存地址(C#)

我试图追踪单声道运行时中的一个错误,其中变量似乎被分配给一个有效对象,然后被重新分配给一个虚假对象,特别是 //early in code I allocate, fine var o = new object(); // valid allocation // later in code this is called, not fine lock(o) // <- is triggering bug due to "o" now referencing a nonsense memory location. 我想知道何时对“o”的引用变得无意义,并且这样做是为了找到一种方法来确定C#代码中不同时间点的“o”的地址。 我知道类似于其他问题的答案“不要那样做有GC”,但GC不起作用所以我需要一个解决方法。 有谁知道如何确定C#中单声道对象的地址? 很好地链接在非托管代码或其他任何东西。 (关于诊断主要问题的方法的任何其他线索)。

应该定期调用GC.Collect()吗?

我最近发布了一篇关于日志文件读取器由于内存不足错误而失败的文章> 内存错误归档日志文件 在我有机会尝试更简单的方法(调用日志文件的名称,其中有一个日期以防止存档)这显然意味着重写方法等,我首先尝试垃圾收集选项,因为我从来没有使用它,例如GC.Collect的()。 如果在尝试读取日志文件内容时抛出内存错误,则将其置于第一次try / catch中,并且它似乎释放了一半内存,例如从此过程中使用的调试文件中释放(因为日志文件明显不在动作所以这是为了帮助我调试事后)我从昨晚的归档过程得到这个回应。 Attempt Archive Take contents of current file with ReadFileString (this is my custom stream reader method I wrote which you can see in the original article) Taken contents of current file! In TRY/CATCH – Out of Memory Exception – Try GC.Collect() Memory used before collection: **498671500** Memory used after […]

如何在C#中有效地处理许多更新对象?

我正在使用C#和XNA开发2D头顶射击游戏。 我有一个我称之为“子弹”的类,需要在每一秒钟内更新许多这些实例。 我这样做的第一种方法是拥有一个通用的子弹列表,并根据需要简单地移除和添加新的子弹。 但是在这样做的过程中,GC经常出现,我的游戏有一些周期性的生涩延迟。 (很多代码被删除了,但只想展示一个简单的代码片段) if (triggerButton) { bullets.Add(new bullet()); } if (bulletDestroyed) { bullets.Remove(bullet); } 我的第二个也是当前的尝试是有一个单独的通用Stack子弹,当我完成一个子弹时我会推动它,如果堆栈中有任何东西,当我需要一个新子弹时弹出子弹。 如果堆栈中没有任何内容,那么我将新的项目符号添加到列表中。 它似乎减少了生涩的滞后,但又一次,有时还会出现一些生涩的滞后(尽管我不知道它是否相关)。 if (triggerButton) { if (bulletStack.Count > 0) { bullet temp = bulletStack.Pop(); temp.resetPosition(); bullets.Add(temp); } else { bullets.Add(new bullet()); } } if (bulletDestroyed) { bulletStack.Push(bullet); bullets.Remove(bullet); } 所以,我知道过早的优化是所有邪恶的根源,但这是非常明显的低效率,我可以提前赶上(这是在甚至不必担心敌人的子弹充满屏幕之前)。 所以我的问题是:将未使用的对象推送到堆栈会调用垃圾收集吗? 参考文件是保持活着还是被破坏的对象? 有没有更好的方法来处理更新许多不同的对象? 例如,我太过花哨了吗? 如果只是遍历列表并找到一个未使用的子弹就可以了吗?

C ++ / CLI:防止非托管资源的托管包装上的垃圾回收

我有一个需要在C#中使用的C ++非托管类NativeDog ,所以我创建了一个包装类ManagedDog 。 // unmanaged C++ class class NativeDog { NativeDog(…); // constructor ~NativeDog(); // destructor … } // C++/CLI wrapper class ref class ManagedDog { NativeDog* innerObject; // unmanaged, but private, won’t be seen from C# ManagedDog(…) { innerObject = new NativeDog(…); … } ~ManagedDog() // destructor (like Dispose() in C#) { // […]

如何在完成View和ViewModel时删除事件处理程序,而不是模型

在我的应用程序中,我经常创建新的视图和ViewModel,但持久化相同的模型。 例如,我可能会在主窗口中显示项目列表的简单视图,并有另一个窗口,其中包含任何特定项目的更多详细信息。 可以随时打开和关闭详细信息窗口,也可以同时打开列表中不同项目的多个窗口。 因此,给定模型对象可以有多个ViewModel,并且需要使用其他位置的更改进行更新。 (我在我的模型上使用了INotifyPropertyChanged 。)当我完成它时,我希望摆脱ViewModels,即,当详细信息窗口关闭时。 public DetailViewModel(MyDetailModel detailModel) { // Retain the Detail Model this.model = detailModel; // Handle changes to the Model not coming from this ViewModel this.model.PropertyChanged += model_PropertyChanged; // Potential leak? } 据我所知,事件处理程序将使Model保留对ViewModel的引用,并防止它被垃圾收集。 1)这是对的吗? 如何判断这些引用是否仍然存在? 2)我应该如何确定不再需要ViewModel并取消订阅事件?