我在一个线程里用
NetworkStream ns = client.GetStream();
StreamReader sr = new StreamReader(ns);
具体意思不清楚也没关系,反正就是把一个IO句柄赋给StreamReader,然后我不关闭这个StreamReader,因为我还要用这个IO句柄,然后在另外一个线程里继续用这个句柄,这样会内存泄露吗?
就是在几个个线程里先后用StreamReader读取同一个句柄,放到一个极限情况,A线程先读,读完了线程退出,但是StreamReader不能close,句柄传递给B线程,B线程读,B线程读完了线程退出,C线程读……依次循环读100个线程,在这样一个极限情况下,这100个StreamReader是不是要等句柄关闭了才被释放C#的垃圾回收只回收无主对象,这样的StreamReader似乎是有主的,我期望的情况当然是每个线程退出的时候把自己的StreamReader关闭掉,而不是等第100个线程读完了,句柄关闭的时候再回收,这样就属于内存泄露了。

解决方案 »

  1.   

    我用的是socket,可能请求比较多,每个socket对象后面跟着100个StreamReader,这样不影响性能吗?就拿数据库打比方也行,我的意思就是不希望每读一点数据就打开关闭,但是除了这个数据库句柄,其他的资源应该及早释放吧,现在的问题是所有和这个句柄有关的数据都会一直打开着。或许我的意思没有表述清楚,我的意思是StreamReader这个对象应该释放,并非是说StreamReader所占有的句柄应该释放,因为很多个StreamReader会占用不必要的内存浪费资源。再清楚一点解释,我只需要一个句柄存活,而它却把后面100个StreamReader都保留下来了。
    本来我只想要一个socket句柄,但是现在是不是意味着每个socket句柄后面都有100个StreamReader,那么如果有100个连接,我的程序里是不是就存活了10000个StreamReader,这些StreamReader会吃进多少内存呢?
      

  2.   

    大致明白你的意思...这个得看你的线程情况.如果你的程序是多线程并发, 不考虑同步问题.
    那么当然一个线程一个StreamReader, 这种情况你也没法共享一个StreamReader.如果是串行执行的... 当然可以只有一个StreamReader.
    比如设一个静态的StreamReader, 用一个计数器,记录线程使用情况, 没有使用了就彻底清理资源.
      

  3.   

    不太满意这个回答,第一,按我上面的说法,到底会不会有内存泄露?或者说这些StreamReader在到底何时关闭?如果有的话,我目前的情况就属于串行,不同步开始,也不同步结束,而且不能共享一个StreamReader,这样的话,StreamReader引起的问题会不会很严重?如何最大程度避免这个情况的发生。最重要的我是希望知道这些StreamReader在到底何时关闭?
      

  4.   

    最好的方法就是自己亲手做测试. VS 2005自带性能测试工具, 你可以自己试试不同的方法性能的差别.另外你可以使用CLRProfile工具进行检查.