0

我在页面加载时调用了母版页中的线程并调用了电子邮件函数,如下所示:

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

实际上,重新阅读您的请求和评论。我想我误解了你的要求。我假设您希望它在页面加载时工作并在与用户所在的线程不同的线程中运行。但是您想要的是不断在 Web 应用程序的后面运行的东西,对吗?

一般来说,我会做的是在后台有一个控制台应用程序来执行此操作。但是你可以在 global.asaxApplication_Start方法中做一些类似的事情。

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.
        }
    }
}

不要忘记将电子邮件标记为已发送,无论您将它们存储在何处。这可能是您多次发送它们的原因。也可能是因为它在每次加载母版页时都在运行。

编辑:解释


网站启动任务创建新线程任务进入循环

任务等待 5 分钟
GetEmailsToSend() 查找 100 封电子邮件中的前 50 封要发送。
迭代并发送电子邮件

任务等待 5 分钟
GetEmailsToSend() 在 100 封电子邮件中查找接下来的 50 封要发送。
迭代并发送电子邮件

任务等待 5 分钟
GetEmailsToSend() 未找到任何电子邮件

任务等待 5 分钟
GetEmailsToSend() 找到 2 封新电子邮件
迭代并发送电子邮件

于 2013-02-07T12:59:13.053 回答