2010-11-24 3 views
1

Я сделал небольшую программу, в которой я могу в принципе отправить электронное письмо через yahoo smtp-сервер. Мой код:Почему программа Send-Email Freeze?

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Net; 
using System.Net.Mail; 
using System.Drawing; 
using System.IO; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

       try 
       { 

        MailMessage message = new MailMessage(); 
        message.From = new MailAddress("[email protected]"); 
        message.To.Add("[email protected]"); 
        message.Subject = "afdasdfasfg"; 
        message.Body = "Hgfk4564267862738I"; 
        message.IsBodyHtml = true; 
        message.Priority = MailPriority.High; 
        SmtpClient sC = new SmtpClient("smtp.mail.yahoo.com"); 
        sC.Port = 587; 
        sC.Credentials = new NetworkCredential("myid", "mypassword"); 
        //sC.EnableSsl = true; 
        sC.Send(message); 
        MessageBox .Show ("Mail Send Successfully"); 

       } 
       catch (Exception ex) 
       { 
        MessageBox .Show (ex + "Mail Sending Fail's") ; 

       } 
      } 

     } 
    } 

Причудливая вещь в том, что она работала в течение первой недели. Я мог отправлять сообщения без проблем. Тогда только вчера программа просто замерзает и не отвечает (я не менял код). Почему это случилось? Как я могу исправить свою программу?

Edit: @Andreas Niedermair Прямо сейчас я просто попробовал программу и оставил ее на целую минуту показала то ошибка: ContextSwitchDeadlock была обнаружен сообщения: Среда CLR не смогло перейти от COM контекста 0x21eb78 к COM контексту 0x21ece8 для 60 секунд. Поток, который владеет целевым контекстом/квартирой, скорее всего, либо выполняет ненакачивание, либо обрабатывает очень длительную операцию без перекачки сообщений Windows. Эта ситуация, как правило, имеет отрицательное влияние на производительность и может даже привести к тому, что приложение становится неактивным или память автоматически накапливается с течением времени. Чтобы избежать этой проблемы, все потоки с одной резьбой (STA) должны использовать примитивы ожидания накачки (например, CoWaitForMultipleHandles) и регулярно накачивать сообщения во время длительных операций.

Благодарим за помощь!

+1

Вы пробовали отлаживать его, чтобы увидеть, где он висит? – Bernard 2010-11-24 17:36:49

+0

, с какой структурой .net вы работаете? – 2010-11-24 18:02:09

ответ

1

Ваш catch когда-либо достигнут?

Я предполагаю, что вы недостаточно терпеливы, чтобы достичь значения по умолчанию для свойства Timeout (100 секунд) ... , вы можете уменьшить значение, чтобы получить более раннее завершение.

до тех пор, пока вы не работаете с асинхронным шаблоном, ваш UI-поток блокируется в любом случае. альтернативой будет использование метода SendAsync (в методах msdn для конкретных методов есть примеры реализации).

Edit:
как автор упомянул о возможном фу ** ред порт: да, это может быть. но вы должны прочитать specification paper, который говорит нам: сервер

  • SMTP: plus.smtp.mail.yahoo.com
  • Использовать SSL
  • Порт: 465
  • Использование аутентификации
  • Имя учетной записи/имя входа: ваш Yahoo! Mail ID (ваш адрес электронной почты без «@ yahoo.com», например, «testing80»)
  • Адрес электронной почты: ваш Yahoo! Почтовый адрес (например, [email protected])
  • Пароль: Ваш Yahoo! Почтовый пароль
  • [...] попробуйте установить номер порта SMTP на 587 при отправке электронной почты через SMTP-сервер Yahoo !.

, но даже если вы соответствуете требованиям: Вы должны действительно пойти на асинхронном-шаблон :)

Edit: упомянутое исключение связано с COM ...немного googeling, и я нашел this:

Что, вероятно, происходит то, что вы есть COM-объект в форме, и вы делаете работу в потоке пользовательского интерфейса. Если ваш пользовательский интерфейс блокируется обработкой в течение> 60 секунд, COM-компонент может жаловаться.

Edit:

иначе: вы ничего менять в исключениях-диалоге Visual Studio? то это может быть ваш solution, или this one (с некоторым базовым объяснением) ...

+0

Не могли бы вы объяснить это мне в коде, пожалуйста? – 2010-11-24 17:39:51

0

Согласно Андреасу Нидермару, редактируйте вопрос, что вы блокируете основную нить более чем на 60 секунд. Лучше всего сделать эту операцию на фоновом потоке.

using System; 
using System.ComponentModel; 
using System.Net; 
using System.Net.Mail; 
using System.Windows.Forms; 

namespace Sandbox_Form 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      bw = new BackgroundWorker(); 
      bw.DoWork +=new DoWorkEventHandler(bw_DoWork); 
      bw.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
     } 

     void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      if(e.Error != null) 
       MessageBox.Show(e.Error.ToString() + "Mail Sending Fail's") ; 
      else 
       MessageBox.Show("Mail Send Successfully"); 
     } 

     BackgroundWorker bw; 

     void bw_DoWork(object sender, DoWorkEventArgs e) 
     { 
      using(MailMessage message = new MailMessage()) 
      { 
       message.From = new MailAddress("[email protected]"); 
       message.To.Add("[email protected]"); 
       message.Subject = "afdasdfasfg"; 
       message.Body = "Hgfk4564267862738I"; 
       message.IsBodyHtml = true; 
       message.Priority = MailPriority.High; 
       using(SmtpClient sC = new SmtpClient("smtp.mail.yahoo.com")) 
       { 
        sC.Port = 587; 
        sC.Credentials = new NetworkCredential("myid", "mypassword"); 
        //sC.EnableSsl = true; 
        sC.Send(message); 
       } 
      } 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      bw.RunWorkerAsync(); 
     } 
    } 

} 

EDIT:

на Andreas Niedermair предложение, вот версия с использованием метода асинхронной вместо.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 

      MailMessage message = new MailMessage(); 
      message.From = new MailAddress("[email protected]"); 
      message.To.Add("[email protected]"); 
      message.Subject = "afdasdfasfg"; 
      message.Body = "Hgfk4564267862738I"; 
      message.IsBodyHtml = true; 
      message.Priority = MailPriority.High; 
      SmtpClient sC = new SmtpClient("smtp.mail.yahoo.com"); 
      sC.Port = 587; 
      sC.Credentials = new NetworkCredential("myid", "mypassword"); 
      //sC.EnableSsl = true; 
      //sC.Send(message); 
      sC.SendCompleted += new SendCompletedEventHandler(sC_SendCompleted); 
      sC.SendAsync(message, null); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex + "Mail Sending Fail's"); 
     } 

    } 

    void sC_SendCompleted(object sender, AsyncCompletedEventArgs e) 
    { 
     if(e.Error != null) 
      MessageBox.Show(ex + "Mail Sending Fail's"); 
     else 
      MessageBox.Show("Mail Send Successfully"); 
    } 
}