必须在Usings中手动关闭StreamWriter吗?

时间:2014-04-22 19:28:48

标签: c# smtp streamwriter

在第二次迭代中,正在使用"文件"在"使用(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;试。

1 个答案:

答案 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太快太激烈了。