C# 使用SmtpClient.Send和附件锁文件,即使在实现Dispose()之后

C# 使用SmtpClient.Send和附件锁文件,即使在实现Dispose()之后,c#,smtpclient,locked-files,C#,Smtpclient,Locked Files,这是我第一次问有关StackOverflow的问题,所以如果您需要更多说明,请告诉我。我试图向系统用户发送带有附件的电子邮件,但是在发送邮件后,我很难清理文件系统上的附件 背景 我正在使用SSIS从SQL数据库中编译电子邮件收件人和邮件内容的列表,然后使用脚本组件使用C#执行实际的电子邮件发送。从角色上讲,我更像是一个DBA/项目经理,并且知道足够的编码来做一些小事情,但是自从我每天都做.Net编码以来已经有好几年了 每次我运行该例程时,都会在专用目录中成功创建附件文件(本例中为Excel文件)

这是我第一次问有关StackOverflow的问题,所以如果您需要更多说明,请告诉我。我试图向系统用户发送带有附件的电子邮件,但是在发送邮件后,我很难清理文件系统上的附件

背景 我正在使用SSIS从SQL数据库中编译电子邮件收件人和邮件内容的列表,然后使用脚本组件使用C#执行实际的电子邮件发送。从角色上讲,我更像是一个DBA/项目经理,并且知道足够的编码来做一些小事情,但是自从我每天都做.Net编码以来已经有好几年了

每次我运行该例程时,都会在专用目录中成功创建附件文件(本例中为Excel文件),然后使用这些附件生成电子邮件并将其放置在分拣文件夹中。在创建和发送每封电子邮件时,我想从其目录中删除附件,但我收到以下错误:

进程无法访问文件“D:\mailtest\{filename}.xls”,因为它正被另一个进程使用

每次出错的具体文件都不一样,在将要生成的约3000封电子邮件中,大约有1200-1500封电子邮件失败

代码 我尝试过的事情
  • 最初,我没有using块。我在一个类似的SO问题上看到了这个建议,但在这里添加它似乎没有什么区别
  • 我已将Dispose()添加到每个路径的finally块中(本例中仅使用pickup目录),我理解这将释放用作附件的文件上的所有锁
  • 如果没有这两种情况,它会在遇到的第一个文件上失败,这让我相信它正在工作,但只工作了一段时间,然后在执行过程中的一个随机点突然失败
  • 当我搜索时,错误中指定的文件没有显示在process explorer中,因此可能在错误发生后会很快释放该文件,因此我无法及时搜索
  • 我尝试将“删除”功能完全移动到一个单独的进程,在所有电子邮件发送后直接运行,但无论如何都会出现相同的消息
如果有人知道可能发生的事情,我将非常感谢任何建议

新信息 添加一些额外的错误处理确实改善了情况,但并没有完全修复它。我已经成功地运行了几次,每次出现错误时,都是在~3000个文件中的1个文件上。但是,它确实显示了相同的错误:“进程无法访问文件'D:\mailtest{…}.xls',因为它正被另一个进程使用。”该错误来自文件。删除行。这让我想知道,仅仅通过添加更多的东西,它的错误是如何减少的。发送和删除的速度是否如此之快,以至于它自己也在步履蹒跚?把东西扔进去能让它慢到能跟上吗

新信息2 我采纳了Jamal的建议,在发送和删除之间增加了500毫秒的延迟,但前提是第一次删除尝试失败。到目前为止,在10次连续运行中没有出现错误,而在添加之前,它在某种程度上失败了每一次运行。然而,FireInformation消息从未出现在输出窗口中,这使我认为它从未到达该块,因此我不确定为什么添加它似乎有效

        //Remove attachment file
    if (File.Exists(attachmentPath))
    {
        try
        {
            File.Delete(attachmentPath);
        }
        catch
        {
            try
            {
                this.ComponentMetaData.FireInformation(0, "Delete failed", "Trying Delete again after 500ms", "", 0, fireAgain);
                System.Threading.Thread.Sleep(500);
                File.Delete(attachmentPath);
            }
            catch (Exception e)
            { 
                Row.ErrorMessage = e.Message;
                this.ComponentMetaData.FireInformation(e.HResult, e.Source, e.Message, e.HelpLink, 0, fireAgain);
            }
        }
    }

excel打开了吗?您是否在任务管理器中看到excel?我怀疑这不是你的代码,可能是excel。@jdweng,我没有打开excel,我只是再次运行它以查看它是否在后台偷偷打开,但它从未出现在任务管理器中。你是否尝试处理客户端?@jdweng,我想我这样做是作为故障排除步骤之一,但在添加using块之前。我现在来试一试,看看这是否有帮助。@jdweng在msg.Dispose()行的前面添加了client.Dispose()。仍然以相同的方式出现错误。是否打开excel?您是否在任务管理器中看到excel?我怀疑这不是你的代码,可能是excel。@jdweng,我没有打开excel,我只是再次运行它以查看它是否在后台偷偷打开,但它从未出现在任务管理器中。你是否尝试处理客户端?@jdweng,我想我这样做是作为故障排除步骤之一,但在添加using块之前。我现在来试一试,看看这是否有帮助。@jdweng在msg.Dispose()行的前面添加了client.Dispose()。仍然以同样的方式出现错误。
        //Remove attachment file
    if (File.Exists(attachmentPath))
    {
        try
        {
            File.Delete(attachmentPath);
        }
        catch
        {
            try
            {
                this.ComponentMetaData.FireInformation(0, "Delete failed", "Trying Delete again after 500ms", "", 0, fireAgain);
                System.Threading.Thread.Sleep(500);
                File.Delete(attachmentPath);
            }
            catch (Exception e)
            { 
                Row.ErrorMessage = e.Message;
                this.ComponentMetaData.FireInformation(e.HResult, e.Source, e.Message, e.HelpLink, 0, fireAgain);
            }
        }
    }