我的服务器上有一个不断运行的应用程序。
我开始一个进入无限循环的线程。
此循环的第一件事是枚举某个文件夹中的目录。
此文件夹有许多子文件夹,可从许多客户端接收小图像文件。
我的循环查找从今天的即时时间/日期起比24小时更早的目录/文件。
如果它比较旧,那么我的代码会删除文件和父文件夹。
然后我的循环将“睡眠”60秒,然后再重复。
现在,我注意到的是,如果要删除大量文件或/并且应用程序已运行了几天,则explorer.exe内存会显着增加。
所以,我必须质疑我的代码。
这是我的代码:
Thread thArchiver = null;
private void btnArchiver_Click(object sender, EventArgs e)
{
try
{
if (btnArchiver.Text == "Start")
{
btnArchiver.Text = "Stop";
lvwServices.Items[4].SubItems[1].Text = "Started";
thArchiver = new Thread(ArchiveWorker);
thArchiver.Start();
}
else
{
btnArchiver.Text = "Start";
lvwServices.Items[4].SubItems[1].Text = "Stopped";
thArchiver.Abort();
}
}
catch { }
}
private void ArchiveWorker()
{
while (true)
{
try
{
List<string> catDirs = Directory.EnumerateDirectories(CataloguePath, "*", SearchOption.TopDirectoryOnly).ToList();
for (int index = 0; index < catDirs.Count; index++)
{
//look at time of creation and then delete the directory
Directory.Delete(catDirs[index]);
}
}
catch (Exception _ex)
{
//report the error
}
Thread.Sleep(60000);
}
}
答案 0 :(得分:0)
这是非常可能的!
原因可能是你的线程只睡60秒
List<string> catDirs = Directory.EnumerateDirectories(CataloguePath, "*", SearchOption.TopDirectoryOnly).ToList();
你正在每个新线程中创建列表,所以发生的事情是文件夹列表及其引用被反复存储。 这是一个永无止境的过程,所以它会继续不断地进行,并且尺寸会增加。 这将存储在内存中,以便您看到这种滞后。
我的建议是: 不要打开新线程并检查最后一个线程是否已完成。
更新: 根据@Andrew和@Maarten的评论可能的原因
List<string> catDirs = Directory.EnumerateDirectories(CataloguePath, "*", SearchOption.TopDirectoryOnly).ToList();
for (int index = 0; index < catDirs.Count; index++)
{
//look at time of creation and then delete the directory
Directory.Delete(catDirs[index]);
}
我觉得Forloop正在花时间,因为可能发生的事情是 Directory.Delete(catDirs [指数]);开始一个新线程本身没有可能发生的事情是有很多文件要在队列中删除,队列日益增加。 这可能是你看到滞后的原因