ошибка при отправке почты из отдельного потока - asp.net/C#

Я работаю в приложении, которое отправляет почту с сервера. так как smtp.send(msg) потребуется некоторое время для связи с сервером. я сделал блок кода отправки в отдельном потоке. Раньше он работал нормально, но после добавления элемента управления таймером timer1 (который выполнял некоторую логику кода). Отправка почты была прервана из-за следующей ошибки:

Невозможно оценить выражение, поскольку код оптимизирован или собственный фрейм находится на вершине стека вызовов

Threading приходит сюда..

void sendMail()
{
ThreadStart sendCreateMail = delegate() { Send(subject); };
Thread threadSendCreateMail = new Thread(sendCreateMail);
sendCreateMail.IsBackground = true;
sendCreateMail.Start();
timer1.Enabled = true;
}

Код net.mail приходит сюда....

protected void Send(string subject)
        {
            try
            {
                MailMessage mail = new MailMessage();
                SmtpClient smtp = new SmtpClient("smtp.office365.com");
                var credential = (System.Net.NetworkCredential)smtp.Credentials;
                string Username = credential.UserName;
                string password = credential.Password;
                mail.From = new MailAddress(Username);
                mail.To.Add(toMail);
                mail.Subject = "subject";

                mail.Body = "msg body";
                mail.IsBodyHtml = true;
                smtp.EnableSsl = true;
                smtp.Credentials = new System.Net.NetworkCredential(Username, password);
                smtp.Send(mail);
                }

ОБНОВЛЕНИЕ

Задача sendMail работает и на других страницах. Здесь это всплывающее окно, так что блок timer1, о котором я уже говорил, выполняет функцию закрытия всплывающего окна. Там он останавливает выполнение потока. что я могу понять (например, response.end, response.redirect не могу угадать, что именно, это сторонний инструмент под названием telerik radwindow!). но как это побороть.


person Mark ben    schedule 28.07.2015    source источник
comment
какую версию с# вы используете?   -  person शेखर    schedule 28.07.2015
comment
Вы можете найти лучший вариант Асинхронное программирование   -  person शेखर    schedule 28.07.2015
comment
Как вы получаете эту ошибку? Это больше похоже на то, что я ожидаю при попытке проверить переменные в отладчике, чем на сообщение об ошибке, которое выдает работающая программа.   -  person Chris    schedule 28.07.2015
comment
ошибка была показана в регистраторе. приложение выглядит нормально во время выполнения, но операция отправки почты не выполнялась @Chris   -  person Mark ben    schedule 28.07.2015
comment
Странный. Тогда у вас проблемы с регистрацией. Я подозреваю, что это не удалось по какой-то более обычной причине (например, не удалось подключиться к smtp-серверу или что-то в этом роде), но по какой-то причине ваш журнал не смог правильно записать это. Мой подход состоял бы в том, чтобы сначала исправить ведение журнала, а затем выяснить реальную причину сбоя и начать оттуда.   -  person Chris    schedule 28.07.2015
comment
нет, проблема не в логировании. задача отправки почты работает на других страницах. здесь это всплывающее окно, так что блок timer1, о котором я уже говорил, выполняет функцию закрытия всплывающего окна. Там он останавливает выполнение потока. что я могу понять (например, response.end, response.redirect!). но как это побороть. @Крис   -  person Mark ben    schedule 28.07.2015
comment
@Markben: Я хотел сказать, что ваш журнал не работает, потому что он дает вам бессмысленное сообщение. Если бы ваше ведение журнала работало, то оно дало бы вам выброшенное исключение, а вместе с ним и трассировку стека с подробным описанием того, где именно что-то пошло не так. Если вы этого не понимаете, то, на мой взгляд, ваша регистрация не работает.   -  person Chris    schedule 28.07.2015
comment
Что касается проблемы. Если добавление таймера вызывает вашу проблему, то, вероятно, в этом таймере есть какой-то код, который вызывает проблему. Может быть, это убивает поток, который вы настроили для отправки почты? Вы не показали, какой код находится в этом, но вы упомянули функцию закрытия всплывающего окна. Это убивает тему, которую вы начали?   -  person Chris    schedule 28.07.2015
comment
убрал таймер,даже сейчас тоже работает. Но когда я удаляю поток и таймер. это работает отлично. НО я хочу добиться этого, используя потоки по причинам ответа @Chris   -  person Mark ben    schedule 28.07.2015
comment
Давайте продолжим обсуждение в чате.   -  person Mark ben    schedule 29.07.2015


Ответы (1)


это то, что я использую в своем приложении

SmtpClient client = new SmtpClient();
client.Port = your port;
client.Host = your host;
client.EnableSsl = true;
client.Timeout = 15000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(your username, your passowrd);
MailMessage mm = new MailMessage(your username, recepient[0], title, message);
for (int a = 1; a < recepient.Count; a++)
    mm.To.Add(recepient[a]);
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
client.SendCompleted += (s, e) =>
{
    client.Dispose();
    mm.Dispose();
};
client.SendAsync(mm, null);
person Vajura    schedule 28.07.2015
comment
не могли бы вы сказать мне, чем он отличается от кода, который я написал .. имеет ли смысл sendAsync и dispose? - person Mark ben; 28.07.2015