在第二次迭代中,正在使用"文件"在"使用(StreamWriter"行。)即使StreamWriter在使用之后应该自动关闭。
编辑1:真实代码
注意:邮件是List<MailMessage>
(使用From / To地址实例化)
foreach (var x in mails)
{
x.Subject = "Updated Google Exchange Rates (" +
DateTime.Now.ToString(new CultureInfo("en-US")) +
")";
StringBuilder emailBody = new StringBuilder();
emailBody.AppendLine("abc"); //<-- simplified
x.Body = emailBody.ToString();
_txtName = x.Subject.Replace(...); //Replaces invalid file-name chars
//Note that _txtName will always be unique due to x.Subject's dependency on DateTime
using (StreamWriter sw = new StreamWriter("./Exchange Rate History/" + _txtName))
{
sw.WriteLine(emailBody);
sw.Close();
}
Attachment attachment = new Attachment("./Exchange Rate History/" + _txtName);
attachment.Name = _txtName;
x.Attachments.Add(attachment);
SmtpClient smtpClient = new SmtpClient("...")
{
Credentials = new System.Net.NetworkCredential("", ""),
Port = 25
};
smtpClient.Send(x);
smtpClient.Dispose();
}
我必须添加&#34; sw.Close();&#34;在&#34;使用&#34;结束之前这个循环工作。为什么呢?
编辑2: 不好了! sw.Close()停止工作了! &#34;正在使用的文件&#34;试。
答案 0 :(得分:0)
发现问题,而不是StreamWriter在usings
之后没有自行关闭。
Chris Sinclair 关于DateTime
不保证唯一文件名是正确的。如果你的for循环很短(因此,很快),你最终会得到重复的名字,这就是我的情况。
对于5封电子邮件,_txtName
生成了5个相同的文件名,这意味着我最终得到了一个文件,因为StreamWriter默认会覆盖。
另外,我忘了在每个循环结束时使用x.Attachments.Dispose();
。
因此,当它重新迭代时,x.Attachments.add()
仍在尝试附加相同的文件(上传时间),而StreamWriter
开始写入同一文件,导致_txtName
生成重复的名称,因为{{1慢于for循环。
TL; DR:for-loop太快太激烈了。