В изоляции нет ничего неправильно с использованием для - в на массивах. Для - в выполняет итерации по названиям свойства объекта, и в случае массива "out-of-the-box", свойства соответствует индексам массива. (Встроенные собственности как length
, toString
и так далее не включены в повторение. если)
Однако, если Ваш код (или платформа Вы используете) добавят пользовательские свойства к массивам или к прототипу массива, то затем эти свойства будут включены в повторение, которое является, вероятно, не, что Вы хотите.
Некоторые платформы JS, как Прототип изменяет прототип Массива. Другие платформы как JQuery не делают, таким образом, с JQuery можно безопасно использовать для - в.
, Если Вы вызываете сомнение, Вы, вероятно, не должны использовать для - в.
альтернативный способ выполнить итерации через массив использует для цикла:
for (var ix=0;ix<arr.length;ix++) alert(ix);
Однако это имеет другой вопрос. Проблема - то, что массив JavaScript может иметь "дыры". Если Вы определяете arr
как:
var arr = ["hello"];
arr[100] = "goodbye";
Затем массив имеют два объекта, но длину 101. Используя для - в приведет к двум индексам, в то время как для цикла приведет к 101 индексу, где эти 99 имеют значение undefined
.
Как вы читаете файлы для создания электронного сообщения? Они должны быть открыты только для чтения, с параметром FileShare
, установленным на FileShare.ReadWrite
... тогда они не должны быть заблокированы. Если вы используете FileStream
, вам также следует заключить свою логику в с помощью ключевого слова
, чтобы ресурс располагался должным образом.
Я считаю, что удаление почтового сообщения сам закроет ресурсы в нем и разблокирует файлы:
using (var mail = new MailMessage())
{
AddAttachments(mail);
}
// File copy code should work here
ненавижу отвечать на мой собственный пост, но да для следующего бедолаги, у которого есть эта проблема, вот исправление:
ПОСЛЕ ОТПРАВКИ СООБЩЕНИЯ
// Send the mail
client.Send(message);
//Clean up attachments
foreach (Attachment attachment in message.Attachments)
{
attachment.Dispose();
}
Удалите вложения ... очищает блокировку, и сообщения по-прежнему будут отправляться с вложениями. Dispose НЕ удаляет файлы, просто удаляет вложения :)
Вы закрываете файлы после того, как закончите их читать? Если вы открываете их для чтения, но не закрываете, когда закончите, они должны быть заблокированы до тех пор, пока программа не выйдет и автоматически не закроет все файлы.
Я часто вижу это при отправке вложений. Обычно я использую что-то вроде следующего:
В коде, который перемещает файлы в другое место, вы можете использовать следующий шаблон:
Внутри цикла для просмотра файлов
bool FileOk = false;
while (!FileOk)
{
try
{
// code to move the file
FileOk = true;
}
catch(Exception)
{
// do nothing or write some code to pause the thread for a few seconds.
}
}