2013-02-07 60 views
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 
} 

邮件会但同一用户多次的邮件发送给他们。

当下一次加载页面时是否可以分配不同的线程和不同的邮件?

+0

重新阅读你的文章并修改 – 2013-02-07 12:52:17

+1

你为什么要把它放在你的母版页的Page_Load中,你是否希望每当有人打电话给使用母版页的页面时,它都会尝试发送这些电子邮件? – Tanner

+1

我会使用Visual Studio调试器来找出为什么你多次发送电子邮件到同一个地址。 –

回答

1

其实,重新读你的要求和意见。我想我误解了你的要求。我假设你希望这种方式能够在页面加载时运行,并以不同的线程运行于用户所在的位置。但是,你想要什么东西能够持续运行在Web应用程序的后面,对吗?

通常,我会做的是在后台有一个控制台应用程序。但是你可以在global.asax Application_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()发现前50出的100封邮件发送。
迭代并发送该电子邮件

任务等待5分钟
GetEmailsToSend()查找下一个50选自100的电子邮件发送。
迭代并发送该电子邮件

任务等待5分钟
GetEmailsToSend()发现没有电子邮件

任务等待5分钟
GetEmailsToSend()发现2名新的电子邮件
迭代并发送该电子邮件

+0

Parallel.ForEach()我没有得到它。 – bs25

+0

每隔5分钟运行一次这个函数是否可以在asp.net应用程序中使用? – bs25

+0

你在写什么框架?我相信它使用.NET4。是的,你可以在一个控制台应用程序的某个5分钟循环中完成。 –