【问题标题】:Why does calling File.Delete() and File.Move() in ASP.NET cause my worker process to hang?为什么在 ASP.NET 中调用 File.Delete() 和 File.Move() 会导致我的工作进程挂起?
【发布时间】:2011-04-21 17:36:30
【问题描述】:

当我执行以下代码删除和移动文件时,我的工作进程挂起:

File.Delete(FullSourceFilePath);
File.Move(FullTempFilePath, FullSourceFilePath);
// update db
Data.AdminUpdateFileSizeandBitrate(FileId, SizeInbytes, Bitrate);
Response.Redirect("?m=File replaced!");

文件夹FullSourceFilePath里面有超过15000个文件。

以上代码导致站点挂起(仅此站点)如果需要移动的文件大于大约 5 MB。当这个问题出现时,我的工作进程开始消耗内存,并逐渐让我的服务器陷入瘫痪。

唯一的恢复解决方案是发出IISRESET /RESTART 命令。

我的环境是:

在 Windows 2003 x86 SP2 上运行的 IIS6
使用 ASP.NET 4.0 和 C# 编写的网站

【问题讨论】:

    标签: c# asp.net iis-6


    【解决方案1】:

    猜测,这里的问题可能是您要将文件移动到的文件夹中的大量文件。

    工作进程是否仅在File.Move() 上挂起?

    尝试做:

    File.Delete(FullSourceFilePath);
    File.Copy(FullTempFilePath, FullSourceFilePath);
    

    其他要尝试的方法是从命令行执行相同的操作,看看是否会导致出现相同的问题。

    如果是这样,那么您的文件系统可能会严重碎片化并且磁盘正在抖动。

    Windows 也不能很好地处理大量文件,如果文件可以以任何方式分类(例如按 ID 范围或日期范围),那么将其分解为子文件夹。

    您还可以运行 DebugDiag 并捕获一个小型转储以查看瓶颈发生在哪里。

    Tess Ferrandez' blog 有一些很棒的文章,介绍了如何使用此工具来确定工作进程高内存使用、崩溃和挂起的原因。

    .NET Debugging Demos - Information and setup instructions

    【讨论】:

    • 谢谢,添加更多信息。同样的操作适用于经典的 asp
    • @nLL - 可能是时候挖掘调试工具以了解发生了什么。
    猜你喜欢
    • 2010-09-10
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多