run a profiler like Allocation Profiler to GotDotNet User Sample: Allocation Profiler
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=36a3e666-6877-4c26-b62d-bfd7cb3154acAnalyzing Memory Leaks Using the .NET Allocation Profiler 
http://www.automatedqa.com/techpapers/net_allocation_profiler.aspalso see other tools at:
http://dotnetweblogs.com/FMARGUERIE/Story/4139.aspx

解决方案 »

  1.   

    .NET 框架的垃圾回收器管理应用程序的内存分配和释放。每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。---摘自msdn我不太懂C#,不过他这个垃圾回收概念明显是抄java的。
    在一个,你用静态变量来同步线程相当不安全,因为有的线程可能因为优先级的问题永远的不到机会来设置变量。
    我觉得你应该用信号量、互斥量、事件等来进行线程通信,当一个线程完成任务时,可以进入睡眠状态来等待检测线程分配新的任务。这样比不断产生新县城来的高效、安全。
      

  2.   

    能不能写一下大概的代码,因为多先程我很多东西不懂。
    睡眠状态怎么写 sleep吗?
    “检测线程分配新的任务”怎么做啊?
    还有一个地方不懂,在下载线程里调用事件也是属于这个线程阿,怎么通知别的线程。我看的书上没有这样的例子阿。
      

  3.   

    这个,我真的不懂c#.如果是vc还行,但不管怎么说,在操作系统层面上,微软的冬冬是共通的,包装的都是相同的api.
    任务可以用特定的数据结构,通过全局变量,或者其他麻烦但安全的方法传递。
    同步对象是内核对象,即是说他们是由操作系统管理的,因此不但可以用于县城通信,还可以用于进程通信,只是同一时间只能由一个线程对他有话事权,以此达到同步目的。建议你看一看jeffrey richter的《windows 高级编程指南》,虽然不是讲c#,但对windows的内部机制讲得很清楚,对window编程很有帮助。
    对于你目前的问题,你可以先看“县城同步”一章。
    至于相应的视线,我相信c#里面一定有。
    至于要不要通读全书,你打听一下ms对操作系统有没有重大改变,知道了也告诉我一声,我周围这方面朋友太少。
      

  4.   

    我没学过c++,所以很多数都看不懂,包括《windows 高级编程指南》,呵呵。
    并且,vs.net的帮助里面没有 线程同步这一章。
    另外c#里有lock()函数,他就是为索住变量的阿,比方说静态变量from1.aaa,我用
    lock(form1.aaa)
    {
       form1.aaa="asdf";
    }
    这样别的线程就不能访问它了,直到它处理完。书上是这样说的。呵呵。
    “还可以用于进程通信“,但我看vs.net帮助上说进程间是不可以通信的阿?那不是相当于两个应用程序之间吗? 好像.net是用 remoting进行的。
      

  5.   

    对了, lymgf兄弟,你有qq吗? 我想详细的问问阿,多先程快把我搞晕了。