Asp.net VB.Net中的共享函数

Asp.net VB.Net中的共享函数,asp.net,vb.net,synchronization,Asp.net,Vb.net,Synchronization,当某人在我的网站上收到个人信息时,我必须发送电子邮件,为此,我使用StringBuilder创建电子邮件的HTML标记 另外,由于它在许多其他地方也是必需的,所以我制作了一个共享函数(我使用的是VB.NET)。现在我唯一关心的是,由于共享功能在所有对象之间共享,可能还有asp.net会话,在一个人的电子邮件形成之前,另一个人访问相同的功能,是否可能导致stringbuilder中的数据被覆盖 目前我的网站没有很多用户,但这会成为未来的一个问题吗。。。请给我一些建议。。。在使用共享功能时,有没有更

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

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

目前我的网站没有很多用户,但这会成为未来的一个问题吗。。。请给我一些建议。。。在使用共享功能时,有没有更好的方法或标准程序可以遵循


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

共享函数只能访问静态/全局变量以及函数范围内的变量。因此,如果函数使用任意数量的静态/共享资源,则需要在函数调用之间进行同步

然而,在您的情况下,听起来您并没有使用任何共享资源,所以这应该不是一个问题

下面的一个案例说明了问题:

 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。当您希望在同一静态资源上处理多个事物时,所有问题都会出现。

共享函数只能访问静态/全局变量以及函数范围内的变量。因此,如果函数使用任意数量的静态/共享资源,则需要在函数调用之间进行同步

然而,在您的情况下,听起来您并没有使用任何共享资源,所以这应该不是一个问题

下面的一个案例说明了问题:

 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。当您希望在同一静态资源上处理多个内容时,所有问题都会出现。

您可以将EmailSender对象附加到当前HttpContext,而不是使用静态方法。这样,每个用户都将拥有自己的EmailSender实例。 下面是C#中的代码:

它将在web和windows应用程序中工作。 现在,每次您想发送电子邮件时,都可以执行以下操作:

GetEmailSender().SendMail(MailInfo mailInfo);

您可以将EmailSender对象附加到当前HttpContext,而不是使用静态方法。这样,每个用户都将拥有自己的EmailSender实例。 下面是C#中的代码:

它将在web和windows应用程序中工作。 现在,每次您想发送电子邮件时,都可以执行以下操作:

GetEmailSender().SendMail(MailInfo mailInfo);

另外,如果您在Framework3.5上使用VB.NET,您可能希望研究使用XML文本来构建HTML而不是StringBuilder。XML文本将使您的代码更具可读性,并允许非常容易地将数据插入到消息中

作为一个简单的例子

Dim msg = <html><body>  
                         Message sent at <%= Now.ToString() %>  
                 </body></html>

myMailMessage.IsBodyHtml = True
myMailMessage.Body = msg.ToString()
Dim msg=
信息发送于
myMailMessage.IsBodyHtml=True
myMailMessage.Body=msg.ToString()

此外,如果您在Framework 3.5上使用VB.NET,您可能希望研究使用XML文本来构建HTML而不是StringBuilder。XML文本将使您的代码更具可读性,并允许非常容易地将数据插入到消息中

作为一个简单的例子

Dim msg = <html><body>  
                         Message sent at <%= Now.ToString() %>  
                 </body></html>

myMailMessage.IsBodyHtml = True
myMailMessage.Body = msg.ToString()
Dim msg=
信息发送于
myMailMessage.IsBodyHtml=True
myMailMessage.Body=msg.ToString()

这不是线程安全的;你应该使用Interlocked.IncrementI,我只是指出了共享资源的问题,而不是构建一个会增加噪音的傻瓜模型;你应该使用Interlocked.IncrementI。我只是指出了共享资源的问题,而不是建立一个会增加噪音的傻瓜模型。哇,如果可能的话,那肯定会让我的工作更轻松。谢谢你的提示…哇,如果这是可能的话,那肯定会让我的工作更轻松。谢谢你的提示。。。