0

ページの読み込み時にマスターページでスレッドを呼び出し、次のように EMail 関数を呼び出しました。

Page_load()
{
    CreatingThread();
}

protected void CreatingThread()
{
    Thread tSendMails;
    tSendMails = new System.Threading.Thread(delegate() { EmailQueueSettings(); });
    tSendMails.IsBackground = true;
    tSendMails.Start();
}

protected void EmailQueueSettings()
{
    // Function to get emails which are not sent ;
    // looping it and sending it one by one
    // Function to send mails
    // Updating the status after mail is sent   
}

メールは送信されますが、同じユーザーに複数回メールが送信されます。

次回ページがロードされたときに別のスレッドと別のメールを割り当てることはできますか?

4

1 に答える 1

1

実際、あなたのリクエストとコメントを読み直しています。私はあなたの要求を誤解したと思います。私は、これがページの読み込み時に機能し、ユーザーがいるスレッドとは別のスレッドで実行されることを望んでいると想定していました。

通常、私が行うことは、これを行うバックグラウンドでコンソール アプリケーションを使用することです。Application_Startしかし、global.asaxメソッドで、これに沿って何かを行うことができます。

void Application_Start(object sender, EventArgs e)
{
    Task beginSendEmailTask = new Task(SendEmailRunningTask);
    beginSendEmailTask.Start();
}

void SendEmailRunningTask()
{
    while (true)
    {
        Thread.Sleep(300000); // 5minutes
        MailMessage[] emails = GetEmailsToSend();
        SmtpClient client = new SmtpClient(); // Configure this

        foreach (MailMessage email in emails) 
        {
            client.Send(email);
            // Mark email in your database/application as sent.
        }
    }
}

どこに保存しても、メールを送信済みとしてマークすることを忘れないでください。これが、複数回送信している理由である可能性があります。また、マスター ページが読み込まれるたびに実行されていることが原因である可能性もあります。

編集:説明


Web サイトがタスクを開始 新しいスレッドを作成 タスクがループに入る

タスクは 5 分間
待機します GetEmailsToSend() は、送信する電子メール 100 通のうち最初の 50 通を見つけます。
メールを繰り返して送信する

タスクは 5 分間
待機します GetEmailsToSend() は、送信する電子メールを 100 通から次の 50 通を見つけます。
メールを繰り返して送信する

タスクは 5 分間
待機します GetEmailsToSend() はメールを検出しません

タスクは 5 分間待機し
ます GetEmailsToSend() は 2 つの新しい電子メールを検出します 電子メール
を反復して送信します

于 2013-02-07T12:59:13.053 に答える