SMTP Отправляет, запирает мои файлы - c#

В изоляции нет ничего неправильно с использованием для - в на массивах. Для - в выполняет итерации по названиям свойства объекта, и в случае массива "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.

23
задан JL. 18 August 2009 в 20:55
поделиться

4 ответа

Как вы читаете файлы для создания электронного сообщения? Они должны быть открыты только для чтения, с параметром FileShare , установленным на FileShare.ReadWrite ... тогда они не должны быть заблокированы. Если вы используете FileStream , вам также следует заключить свою логику в с помощью ключевого слова , чтобы ресурс располагался должным образом.

Обновление:

Я считаю, что удаление почтового сообщения сам закроет ресурсы в нем и разблокирует файлы:

using (var mail = new MailMessage())
{
    AddAttachments(mail);
}
// File copy code should work here
52
ответ дан 29 November 2019 в 00:52
поделиться

ненавижу отвечать на мой собственный пост, но да для следующего бедолаги, у которого есть эта проблема, вот исправление:

ПОСЛЕ ОТПРАВКИ СООБЩЕНИЯ

        // Send the mail
        client.Send(message);

        //Clean up attachments
        foreach (Attachment attachment in message.Attachments)
        {
            attachment.Dispose();
        }

Удалите вложения ... очищает блокировку, и сообщения по-прежнему будут отправляться с вложениями. Dispose НЕ удаляет файлы, просто удаляет вложения :)

17
ответ дан 29 November 2019 в 00:52
поделиться

Вы закрываете файлы после того, как закончите их читать? Если вы открываете их для чтения, но не закрываете, когда закончите, они должны быть заблокированы до тех пор, пока программа не выйдет и автоматически не закроет все файлы.

3
ответ дан 29 November 2019 в 00:52
поделиться

Я часто вижу это при отправке вложений. Обычно я использую что-то вроде следующего:

В коде, который перемещает файлы в другое место, вы можете использовать следующий шаблон:

Внутри цикла для просмотра файлов

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.
   }

}
0
ответ дан 29 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: