2

基本的にyahoo smtpサーバーを介して電子メールを送信できる小さなプログラムを作成しました。私のコード:

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("myid@yahoo.com");
                    message.To.Add("anotherid@yahoo.com");
                    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") ;

                }
            }

        }
    }

奇妙なことに、最初の 1 週間は効果がありました。問題なくメッセージを送信できました。それからちょうど昨日、プログラムがフリーズし始めて応答しません(コードを変更していません)。なぜこれが起こったのですか?プログラムを修正するにはどうすればよいですか?

編集: @Andreas Niedermair 今、プログラムを試してみて、1 分間放置したところ、エラーが表示されました:ContextSwitchDeadlock が検出されました メッセージ: CLR は、COM コンテキスト 0x21eb78 から COM コンテキスト 0x21ece8 に 60 秒間遷移できませんでした。宛先コンテキスト/アパートメントを所有するスレッドは、非ポンピング待機を行っているか、Windows メッセージをポンピングせずに非常に長時間実行されている操作を処理している可能性があります。この状況は通常、パフォーマンスに悪影響を及ぼし、アプリケーションが応答しなくなったり、メモリ使用量が時間の経過とともに継続的に蓄積したりする可能性さえあります。この問題を回避するには、すべてのシングル スレッド アパートメント (STA) スレッドでポンピング待機プリミティブ (CoWaitForMultipleHandles など) を使用し、実行時間の長い操作中に定期的にメッセージをポンピングする必要があります。

ご協力いただきありがとうございます!

4

2 に答える 2

1

あなたはcatch今までに到達しますか?

Timeoutプロパティのデフォルト値(100秒)に到達するのに十分な忍耐力がないと思います...値を減らして、より早く完了することができます。

非同期パターンを使用していない限り、UIスレッドはとにかくブロックされます。別の方法は、メソッドを使用することSendAsyncです(特定のメソッドのmsdn-entriesにサンプル実装があります)。

編集:
作者が可能性のあるfu ** edポートについて述べたように:はい、そうかもしれません。ただし、仕様書を読む必要があります。

  • SMTPサーバー:plus.smtp.mail.yahoo.com
  • SSLを使用する
  • ポート:465
  • 認証を使用する
  • アカウント名/ログイン名:あなたのYahoo! メールID(「@ yahoo.com」を含まないメールアドレス、たとえば「testing80」)
  • メールアドレス:あなたのYahoo! メールアドレス(例:testing80@yahoo.com)
  • パスワード:あなたのYahoo! メールパスワード
  • [...] Yahoo!のSMTPサーバー経由でメールを送信する場合は、SMTPポート番号を587に設定してみてください。

しかし、仕様を満たしている場合でも、実際には非同期パターンを選択する必要があります:)

編集: 言及された例外はCOMに関連しています...少しグーゲル化しています、そして私はこれを見つけまし

おそらく何が起こっているのかというと、フォームにCOMオブジェクトがあり、UIスレッドで作業を行っているということです。UIが60秒を超える処理によってブロックされると、COMコンポーネントが文句を言う可能性があります。

編集:

それ以外の場合:Visual Studioの例外ダイアログ内で何か変更しましたか?次に、これはあなたの解決策、またはこれ(いくつかの基本的な説明付き)である可能性があります...

于 2010-11-24T17:37:49.497 に答える
0

Andreas Niedermairの編集によると、問題はメインスレッドを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("myid@yahoo.com");
                message.To.Add("anotherid@yahoo.com");
                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();
        }
    }

}

編集:

Andreas Niedermair の提案に従って、代わりに async メソッドを使用するバージョンを次に示します。

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("myid@yahoo.com");
            message.To.Add("anotherid@yahoo.com");
            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");
    }
}
于 2010-11-24T18:56:36.823 に答える