当一个人在我的网站上收到个人信息时,我必须发送电子邮件,为此,我使用StringBuilder创建电子邮件的HTML标记。
也因为它在许多其他地方也需要我做了一个共享功能(我使用的是VB.NET)。现在我唯一关心的是,由于共享函数是在所有对象之间共享的,也许是asp.net会话,在一个人形成电子邮件和另一个人访问同一个函数之前,是否有可能导致stringbuilder中的数据被覆盖..
目前我的网站没有很多用户,但将来会成为一个问题...请告诉我这个......使用共享功能时有更好的方法或标准程序吗?
此外,有一次我犯了使用共享连接对象的错误,如果有很多人访问它会导致关闭。
答案 0 :(得分:3)
共享函数只能访问函数范围内的静态/全局变量和变量。因此,如果该函数使用任意数量的静态/共享资源,则需要在函数调用之间进行同步。
但是,在您的情况下,它听起来并不像您正在使用任何共享资源,因此它应该不是问题。
这是一个说明问题的案例:
private static myCounter As Integer = 0
public shared function IncreaseCount() As Integer
myCounter += 1
for i as integer = 0 to 10 million
//'do extensive work
next
return myCounter
End Function
想象一下你第一次调用这个函数,你会期望它返回数字1.但由于在第一个函数调用返回之前再次调用该函数,所以计数器再次增加,这意味着两个函数调用都返回2而不是分别为1和2.当你想要在同一个静态资源上工作时,所有问题都会到来。
答案 1 :(得分:2)
您可以将EmailSender对象附加到当前的HttpContext,而不是使用静态方法。这样每个用户都将拥有自己的EmailSender实例。 这是C#中的代码:
private static EmailSender _instance;
public static EmailSender GetEmailSender()
{
if(System.Web.HttpContext.Current != null)
{
if(! System.Web.HttpContext.Current.Items.ContainsKey("EmailSender"))
System.Web.HttpContext.Items["EmailSender"]=new EmailSender();\
return (EmailSender)System.Web.HttpContext.Current.Items["EmailSender"];
}
if(_instance==null)
_instance=new EmailSender();
return _instance;
}
它可以在Web和Windows应用程序中使用。 现在,每当您想发送电子邮件时,您都可以按照以下步骤进行操作:
GetEmailSender().SendMail(MailInfo mailInfo);
答案 2 :(得分:1)
此外,如果您在Framework 3.5上使用VB.NET,您可能希望使用XML文字来构建HTML而不是StringBuilder。 XML文字将使您的代码 SUPREMELY 更具可读性,并允许非常轻松地将数据插入到您的消息中。
作为一个简单的例子......
Dim msg = <html><body>
Message sent at <%= Now.ToString() %>
</body></html>
myMailMessage.IsBodyHtml = True
myMailMessage.Body = msg.ToString()