0

我有以下代码打开一个页面并向在课堂会话中注册的学生发送电子邮件,并附上他们的证书,生成电子邮件和证书都在不同的 aspx 页面中工作。现在,我想生成相同的流程,而不需要用户等到所有电子邮件都发送完毕,如果有任何问题,我会在流程中添加额外的代码来通知我。谁能指出我实现这一目标的正确方向。我已经阅读了几个论坛,但大多数情况下我发现 Windows 服务是一种选择,IMO 有点过分了。我很感激任何建议

先谢谢了,

Protected Sub lbEmailOLetter_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbEmailOLetter.Click


       Dim id As Integer
        id = hfSessionID.Value
        If id > 0 Then


            Try
                HttpContext.Current.Server.Execute("Email.aspx?SessID=" & id, False)
                HttpContext.Current.ApplicationInstance.CompleteRequest()


            Catch ex As Exception
                lMessage.Text = "Could not send email with attachment."
            End Try
        Else
            lMessage.Text = "Must create and save a session in order send letter by email."
        End If

    End Sub
4

3 回答 3

0

您应该查看.Net 中的生产者/消费者模式,特别是在使用任务并行库时。

我建议使用一个类的共享(静态)BlockingCollectionbc)容器来模拟您的电子邮件内容(mailItem),由默认支持ConcurrentQueue

在启动您的应用程序期间,例如在Application.Startin 中global.asax,放置您当前Email.aspx页面用来发送电子邮件的代码,但它只是循环通过排队的邮件项目(如果目前没有,它将阻塞)。

后台工作线程看起来像:

For Each mailItem In bc.GetConsumingEnumerable()
  ... send mail (Code from `Email.aspx`)
Next

然后在需要排队发送电子邮件的页面上:

Dim mailItem as new MailItem()
mailItem.To = "mickey@mouse.com"
mailItem.Subject = ...
bc.Add(mailItem)

随着每个 mailItem 被放入队列,后台线程将处理它。

于 2013-09-25T20:19:09.753 回答
0

您可以在您的服务器上运行一个单独的服务,您可以在其中发送要在队列中发送的邮件的电子邮件 ID,以便该服务将异步处理该过程。

于 2013-09-25T20:00:23.410 回答
0

查看 Task.Factory 将此任务转入另一个线程

例如 那里有 vbsamples

于 2013-09-25T20:02:51.577 回答