我从阅读MSDN文档中了解到,IDisposable接口的"主要"用途是清理非托管资源.
对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.
例如:
public class MyCollection : IDisposable
{
private List<String> _theList = new List<String>();
private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();
// Die, clear it up! (free unmanaged resources)
public void Dispose()
{
_theList.clear();
_theDict.clear();
_theList = null;
_theDict = null;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
DataSet和DataTable都实现了IDisposable,因此,通过传统的最佳实践,我应该调用它们的Dispose()方法.
但是,从我到目前为止所读到的,DataSet和DataTable实际上并没有任何非托管资源,因此Dispose()实际上并没有做太多.
另外,我不能只使用,using(DataSet myDataSet...)因为DataSet有一组DataTables.
所以,为了安全起见,我需要遍历myDataSet.Tables,处理每个DataTable,然后处理DataSet.
那么,在我的所有DataSet和DataTables上调用Dispose()是否值得麻烦?
附录:
对于那些认为应该处理DataSet的人:通常,处理的模式是使用usingor try..finally,因为你想保证将调用Dispose().
然而,这对于一个集合来说真的很快.例如,如果对Dispose()的一个调用抛出异常,你会怎么做?你吞下它(这是"坏"),以便你可以继续处理下一个元素?
或者,你是否建议我只调用myDataSet.Dispose(),而忘记在myDataSet.Tables中处理DataTables?
从这个线程,Dispose()必须显式调用一次性对象.
Windows服务停止后会发生什么?这些对象使用的资源是否会自动释放?或者应该在服务停止之前处理它们:
public void Stop()
{
cancellationTokenSource.Cancel();
waitForAllTasksToExit();
cancellationTokenSource.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
"这是一个很好的做法,处理","他们应该在服务停止时被释放"是我的想法.但参考文档是否有具体的答案?
我在WP7项目上运行了一个C#XNA,我发现它在屏幕更改之间占用了内存而没有返回它,最终导致了一个outofmemoryexception.
我看了看,但我不能为我的生活找到这个记忆的去向.
有什么方法可以找出内存的使用位置以及为什么不将其返回给设备?
谢谢你的帮助!
我是否需要在finally块中为SqlTransaction调用dispose?假装开发人员没有在任何地方使用USING,只需尝试/捕获.
SqlTransaction sqlTrans = con.BeginTransaction();
try
{
//Do Work
sqlTrans.Commit()
}
catch (Exception ex)
{
sqlTrans.Rollback();
}
finally
{
sqlTrans.Dispose();
con.Dispose();
}
Run Code Online (Sandbox Code Playgroud) 我开始了一个项目,其概念是在整个游戏中不断重复使用相同的texture2d对象,定期重新加载新纹理.随着时间的推移,我在运行时遇到了一个坏主意:System.OutOfMemoryException
bool loadImages(string image)
{
System.Diagnostics.Debug.WriteLine("beginning loading textures " + image);
try
{
//image_a = null;
//image_o = null;
//image_o.Dispose();
//image_a.Dispose();
image_o = Content.Load<Texture2D>("images/"+image);
image_a = Content.Load<Texture2D>("images/" + image+"_a");
return true;
}
catch
{
System.Diagnostics.Debug.WriteLine("cannot load textures " + image);
image_a.Dispose();
image_o.Dispose();
}
return false; //make sure the caller loads the subsequent image
}
Run Code Online (Sandbox Code Playgroud)
我猜想XNA在每次新的内容加载时都会保留过去的纹理,所以我重新编写了程序,而是保存一个游戏对象列表,每个对象都有自己的texture2d对象.在浏览列表后,我将处理前一个列表项的纹理对象,并将下一个列表项的纹理加载到其纹理对象.该列表只会在整个游戏中遍历一次,我只是定期进入下一个纹理集,我只会选择加载2个纹理,所以理论上应该始终只需要内存中的2个纹理.我仍然遇到内存错误.这就好像我完全不能依赖dispose方法及时释放内存中的纹理.
我正在加载的纹理都没有超过125KB,我正在为Windows Phone 7构建这个
删除不再需要的纹理的最佳方法是什么?参考代码:我应该创建新的texture2d对象,交换它们,并处理原件吗?
我的理解是,如果在 foreach 循环中调用实现模式的对象IDisposable,它会被自动处理,而不需要在使用或调用Dispose方法中显式使用它。我有以下代码
class Program
{
static void Main(string[] args)
{
using (Employee e = new Employee() { Name = "John" }) ;
{
}
foreach (var e in GetEmployees())
Console.WriteLine(e.Name);
}
static List<Employee> GetEmployees()
{
Employee emp = new Employee() { Name = "Peter" };
Employee emp2 = new Employee() { Name = "Smith" };
List<Employee> emps = new List<Employee>();
emps.Add(emp);
emps.Add(emp2);
return emps;
}
}
class Employee : IDisposable
{
public string Name { …Run Code Online (Sandbox Code Playgroud)