C# 为什么创建这些线程不';你不能释放内存吗?
我有这样一个密码:C# 为什么创建这些线程不';你不能释放内存吗?,c#,multithreading,asp.net-core,memory-leaks,garbage-collection,C#,Multithreading,Asp.net Core,Memory Leaks,Garbage Collection,我有这样一个密码: class Engine { private static Thread f_thread; private static System.Timers.Timer timeWatch; public static void Start() { try { timeWatch = new System.Timers.Timer(30000); timeWatch.E
class Engine
{
private static Thread f_thread;
private static System.Timers.Timer timeWatch;
public static void Start()
{
try
{
timeWatch = new System.Timers.Timer(30000);
timeWatch.Elapsed += FolderMonitor;
timeWatch.AutoReset = true;
timeWatch.Enabled = true;
}
catch (Exception ex)
{
// catch error
}
}
public static void FolderMonitor(object source, ElapsedEventArgs e)
{
f_thread = new Thread(FileScan);
f_thread.Start();
}
public static void FileScan()
{
if (timeWatch != null)
{
timeWatch.Stop();
}
try
{
// some operations
}
catch (Exception ex)
{
// catch error
}
timeWatch.Start();
}
}
在远程计算机上运行的.NET Core 2.2 Windows服务上。
如果我在跑步一周后检查记忆,它会不断长大
它似乎没有释放线程分配的内存(某种内存泄漏)
但是,如果我在线程的FileScan函数中“什么都不做”,它也会长大(较小,但id会)。
发生了什么事?GC不应该自动释放它吗?属于这些对象的静态对象和变量(即您创建和运行的线程)不会在C#中被垃圾收集 对于要进行垃圾收集的线程,它必须属于非静态对象,必须停止并且清除所有引用(mythread=null) 我在使用线程时也遇到过同样的问题,用C#编写音频流专用服务器
当我发现漏洞时,我不得不重新思考并重新编写大部分代码 你知道GC在不可预测的时间运行吗?@Sweeper是的,但我希望一周至少“一次”:你的方法名称意味着你正在处理文件句柄,你正在处理所有句柄吗?例如,
使用
@RandRandom当然可以。您是如何检查内存的?您是否调用GC.GetTotalMemory(true)
方法?