VB.Net中的共享功能

时间:2009-09-12 06:49:17

标签: asp.net vb.net synchronization

当一个人在我的网站上收到个人信息时,我必须发送电子邮件,为此,我使用StringBuilder创建电子邮件的HTML标记。

也因为它在许多其他地方也需要我做了一个共享功能(我使用的是VB.NET)。现在我唯一关心的是,由于共享函数是在所有对象之间共享的,也许是asp.net会话,在一个人形成电子邮件和另一个人访问同一个函数之前,是否有可能导致stringbuilder中的数据被覆盖..

目前我的网站没有很多用户,但将来会成为一个问题...请告诉我这个......使用共享功能时有更好​​的方法或标准程序吗?

此外,有一次我犯了使用共享连接对象的错误,如果有很多人访问它会导致关闭。

3 个答案:

答案 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()