На 2-й итерации ошибка «файл используется» возникает в строке «using (StreamWriter»). Несмотря на то, что StreamWriter должен автоматически закрываться после выхода из использования.
ИЗМЕНИТЬ 1. Настоящий код
Примечание: mails - это 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();
}
Мне пришлось добавить "sw.Close ();" До окончания "использования", чтобы этот цикл работал. Почему?
РЕДАКТИРОВАТЬ 2: О нет! sw.Close () перестала работать! "файл используется" снова.
y++
) и не открывает повторно один и тот же файл. РЕДАКТИРОВАТЬ: это ваш актуальный код? - person Chris Sinclair   schedule 22.04.2014DateTime.Now
), и поэтому это не проблема с закрытием файла, но два независимых потока / процесса пытаются одновременно записать в один и тот же файл? Дополнительный вызов закрытия или просто ошибка выборки такова, что она просто случилась сработала, когда вы добавилиsw.Close()
, но запустить ее достаточно раз, она все равно не сработает? - person Chris Sinclair   schedule 22.04.2014"Oh no! sw.Close() stopped working! "file being used" again."
Держу пари, что это так, вероятно, в сочетании со ссылкой Стива. Я не вижу причин предполагать, что каждая итерация вашегоforeach
цикла будет давать уникальное имя файла. Если итерация выполняется достаточно быстро,DateTime.Now
может выдать точно такое же значение. Если у вас есть несколько потоков, выполняющих это, или один поток работает достаточно быстро в сочетании сAttachment
удалением Стива, это может вызвать эту проблему. - person Chris Sinclair   schedule 22.04.2014