Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务并行性、内存管理和任务结束_C#_.net_Multithreading_Memory_Task Parallel Library - Fatal编程技术网

C# 任务并行性、内存管理和任务结束

C# 任务并行性、内存管理和任务结束,c#,.net,multithreading,memory,task-parallel-library,C#,.net,Multithreading,Memory,Task Parallel Library,我有一个需要并行处理文件的进程,所以我尝试使用.net的任务库来完成这个任务。我有一个类在静态方法中执行任务,如下所示: Task.Factory.StartNew( () => FileProcessor.ProcessAFile(new FileInfo(e.FullPath))); 问题在于,一旦静态方法完成,线程似乎永远不会被释放,或者内存永远不会被回收。该方法进行了一些图像处理,因此保留了大量内存,我观察到该过程在稳定之前消耗了大约1GB的内存。这是线程池在幕后工作并确定1GB

我有一个需要并行处理文件的进程,所以我尝试使用.net的任务库来完成这个任务。我有一个类在静态方法中执行任务,如下所示:

Task.Factory.StartNew(
() => FileProcessor.ProcessAFile(new FileInfo(e.FullPath)));

问题在于,一旦静态方法完成,线程似乎永远不会被释放,或者内存永远不会被回收。该方法进行了一些图像处理,因此保留了大量内存,我观察到该过程在稳定之前消耗了大约1GB的内存。这是线程池在幕后工作并确定1GB是适当的内存量以保持,还是我有更深层次的内存泄漏问题

我认为生成1GB内存需要相当长的时间,因此,
GC
可能会将此数据移动到第二代/第三代,与第一代相比,第二代/第三代的检查频率较低,因此数据回收需要一定的时间。这可能不是内存泄漏问题,因为正如您所提到的,它最终会稳定下来


您可以通过调用来加快进程,这将迫使
GC
立即从所有代收集数据。在调用
Collect
方法之前,您需要确保对该数据块的所有引用都已为空。

“在它变平之前。”是您的答案。线程池和任务都与内存管理无关-由GC决定何时收集内存以及使用多少内存。如果您在任务完成后一直持有对任务的引用,GC可能永远没有机会按您期望的方式完成其工作。