相关疑难解决方法(0)

正确使用IDisposable接口

我从阅读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在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?

.net c# garbage-collection idisposable

1586
推荐指数
12
解决办法
31万
查看次数

我应该Dispose()DataSet和DataTable吗?

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?

datatable dispose idisposable using dataset

187
推荐指数
7
解决办法
10万
查看次数

在Windows服务停止之前是否应丢弃一次性对象?

这个线程,Dispose()必须显式调用一次性对象.

Windows服务停止后会发生什么?这些对象使用的资源是否会自动释放?或者应该在服务停止之前处理它们:

public void Stop()
{
    cancellationTokenSource.Cancel();
    waitForAllTasksToExit();
    cancellationTokenSource.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

"这是一个很好的做法,处理","他们应该在服务停止时被释放"是我的想法.但参考文档是否有具体的答案?

c# dispose

8
推荐指数
1
解决办法
968
查看次数

如何在C#中找到内存消耗的位置?

我在WP7项目上运行了一个C#XNA,我发现它在屏幕更改之间占用了内存而没有返回它,最终导致了一个outofmemoryexception.

我看了看,但我不能为我的生活找到这个记忆的去向.

有什么方法可以找出内存的使用位置以及为什么不将其返回给设备?

谢谢你的帮助!

c# memory xna windows-phone-7 xna-4.0

7
推荐指数
1
解决办法
3067
查看次数

SqlTransaction是否需要调用Dispose?

我是否需要在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)

.net dispose transactions sqltransaction

7
推荐指数
2
解决办法
1万
查看次数

在XNA中,处理不再需要的纹理的最佳方法是什么?

我开始了一个项目,其概念是在整个游戏中不断重复使用相同的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对象,交换它们,并处理原件吗?

xna textures memory-management out-of-memory

2
推荐指数
1
解决办法
2756
查看次数

为什么这些对象没有被处置

我的理解是,如果在 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)

c# foreach idisposable

1
推荐指数
1
解决办法
506
查看次数