Я сомневаюсь, что это ваша проблема, но она вызывает у меня плохое предчувствие:
try
{
conn.Open();
comm.ExecuteNonQuery();
...
}
finally
{
comm.Dispose();
conn.Dispose();
}
Я бы просто использовал здесь вложенные операторы using
. Потому что, хотя оператор using
является синтаксическим сахаром для блока try/finally
, вложенные операторы using
являются синтаксическим сахаром для вложенных try/finally
блоков, и это не то, что здесь происходит. Я сомневаюсь, что comm.Dispose()
вызывает исключение, но если это произойдет, conn.Dispose()
никогда не будет вызван.
Также: есть ли причина, по которой вы создаете новый SqlConnection
объект в UnqueueEmail
вместо передачи его из методов, которые его вызывают? Опять же, это, вероятно, не источник вашей проблемы.
Все, что было сказано, первое, что я бы сделал в вашей ситуации, - это создайте сборку этого сервиса со всем закомментированным SMTP-кодом и наблюдайте за использованием памяти при его запуске. Это довольно быстрый способ определить, связана ли проблема с базой данных или кодом почтовой программы. Если из-за этого проблема исчезнет, следующее, что я сделаю, это реализую фиктивный класс SmtpClient
с заглушенными версиями всех методов, которые служба вызывает и снова тестирует; это скажет вам, находится ли проблема внутри самого класса SmtpClient
или в коде, который строит данные для него. Это займет около часа или около того, и вы получите важные данные о вашей проблеме, которых у вас сейчас нет.
Редактировать
Под "ложным SmtpClient
классом с заглушенными методами" я имею в виду что-то вроде этого:
public class MockSmtpClient()
{
public string From { get; set; }
public string To { get; set; }
public void Send(MailMessage message) { }
}
и т. Д. Затем пересмотрите свою программу, чтобы создать экземпляры MockSmtpClient
вместо SmtpClient
.
Поскольку ваша программа, похоже, не смотрит ни на одно из свойств SmtpClient
, ни проверяет возвращаемые значения каких-либо функций, ни обрабатывает какие-либо события, она должна вести себя так же, как и до реализации этого - только он не будет отправлять почту. Если у него все еще есть проблемы с памятью, вы исключили SmtpClient
в качестве возможной причины.