如何解决单击“ ASP.NET”后,无需等待操作完成执行即可发送电子邮件
简而言之,保留在HTTP上下文中,我希望用户在单击订单完成按钮后,不要等待邮件发送之后再发送回“ thak you page”。
我看到HostingEnvironment.QueueBackgroundWorkItem可以帮助我解决此问题,但始终存在被IIS回收杀死的风险。
什么是最好的解决方案?
我知道最好的办法是开发一个单独的控制台解决方案,但是对于3/4封电子邮件来说这是不值得的,或者我可以考虑通过使其异步来加快速度?
Protected Sub btnConcludiOrdine_Click(sender As Object,e As System.EventArgs) Handles btnConcludiOrdine.Click
If IsValidOrder(Me._cart,msg) Then
If Me._cart.SaveOrder(Me._user,Me._orderCode,Me._lang) then
'Update quantity in db
Dim mail As New EmailBLL
mail.SendOrderNotice(Me._cart,Me._lang) '2 Mails
mail.SendProductNotice() '2 Mails
End If
Else
Response.Redirect("*Error URL*")
End If
End Sub
解决方法
按照建议的方式进行处理–启动任务,或所谓的新处理器线程。
因此,您要做的就是分解代码-如果后面的代码是针对Web表单的,则甚至可以使用该代码。
因此,第一步是移出“慢速”部分,或者我们要分开运行的部分。
主要问题是要启动/启动/想要/渴望/实现全新的处理器线程吗?
子调用只能通过一个“参数”,而子只能接受一个参数!!!!
在您的情况下,我注意到例程需要两个值。
但是,“一个参数”可以是“许多”值的数组,甚至可以是一个集合或其他任何值。在我们的例子中,我们传递了两个值。
因此请记住,您调用的内容无法更新或“使用”表单上控件的值-该表单的实例将超出范围。
但是我们当然可以通过您需要的值。这将使该例程可以100%独立于网络表单运行。
我也非常强烈建议您是否将子项目放在相同的网页代码后面?您应该/可以将该子项目标记为共享。这样做会使编译器生您的气,并在该例程说要使用或更新表单上的控件值时吐出错误。
但是,最好将此子项放在Web表单代码后面的单独标准代码模块中。
无论以上内容如何,我们现在都可以这样重写代码:
If Me._cart.SaveOrder(Me._user,Me._orderCode,Me._lang) then
Dim myInfo(1) as object
myInfo(0) = me.cart
myInfo(1) = me_._lng
Call MyUpdateQ(myInfo)
End If
' bla bla lba
Shared Sub MyUPdateQ(p() as object)
'Update quantity in db
Dim mail As New EmailBLL
mail.SendOrderNotice(p(0),p(1)
mail.SendProductNotice() '2 Mails
End Sub
好的,到目前为止,我们还没有取得什么成就,但是我们在这里重写以接受一个数组是KEY。
因此,现在确保上面的命令可以运行/正常运行,并且一切正常。
现在,由于我们将“工作负荷”移到了该例程,因此启动线程现在很简单。
现在,我们上面的代码变为:
Protected Sub btnConcludiOrdine_Click(sender As Object,e As System.EventArgs) Handles btnConcludiOrdine.Click
If IsValidOrder(Me._cart,msg) Then
If Me._cart.SaveOrder(Me._user,Me._lang) then
Dim myInfo(1) as object
myInfo(0) = me.cart
myInfo(1) = me_._lng
Dim MyThread As New Thread(New ParameterizedThreadStart(AddressOf MyUpdateQ))
MyThread.Start(myInfo)
End If
Else
Response.Redirect("*Error URL*")
End If
End Sub
Shared Sub MyUPdateQ(p() as object)
'Update quantity in db
Dim mail As New EmailBLL
mail.SendOrderNotice(p(0),p(1)
mail.SendProductNotice() '2 Mails
End Sub
就是这样。现在,当您单击按钮时,它将等待零时间,因为长时间运行的例程现在将作为单独的线程运行100%。这也意味着,当用户单击按钮时,页面将立即做出响应并回发给用户。因此,如果该线程花费6秒钟甚至25秒钟,用户将不会注意到此延迟。
,只需在Task中推送您的发送邮件逻辑,如果您对结果不感兴趣,请不要等待它。 c#语法
Task.Run(() => SendEmail());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。