【问题标题】:VB.net ASP.net class Library Project Shared (Static) variable inside public class公共类中的 VB.net ASP.net 类库项目共享(静态)变量
【发布时间】:2016-04-17 12:38:36
【问题描述】:

我们有一个类库项目用于保存我们的基本数据定义、sql 函数和泛型函数。这个类库用在或winform项目和我们的asp.net项目中。

在其中一个类中,我们设置了通用函数和共享变量。

Public Class Generic
    Public Shared CurrentDeviceUniqueIdentifier As String
    Public Shared TimeDiffFromServer As Long
    Public Shared myLogger As Logger

....
end Class

并且它们在类库中也可以在 winform/asp.net 项目中访问。

 If Generic.myLogger IsNot Nothing Then Generic.myLogger.WriteLog(...)

这些共享变量不会导致任何问题 winform 项目,因为这些变量只有一个实例并且系统没有任何问题。

但是 asp.net 项目在会话中混淆了这些共享变量,因此它们是共享的。

我可以将类转换为模块,因为系统是用 VB 而不是 C# 设计的。但不确定这是否能解决问题。(应该) 以防将来我们可能想要转换为 C#,但这是行不通的。

但我很好奇是否有任何其他方法可以解决共享变量锁定到 asp.net 会话的问题。

【问题讨论】:

  • 在 ASP.Net 应用程序中拥有一个供不同用户会话使用的共享方法或属性非常好。那你有什么问题?
  • 静态(共享)值自己根本不会引起任何问题。但是您可能以一种有问题的方式使用它们,尤其是在多线程多用户环境中。您遇到的问题究竟是什么
  • 每个客户端的记录器会转到不同的文件夹,因此当有多个客户端时,日志会混淆。无法将其转换为会话编码,因为该类库也在类库内部使用,该类库在winforms内部使用也会导致问题。
  • 我想我需要问一下是否有共享的替代方法,比如使用模块但不是首选方法。

标签: c# asp.net vb.net


【解决方案1】:

静态类和数据在 ASP.NET 会话之间共享。时期。更改为 Module 不会改变问题,因为 Module 中的 _everything" 是共享的。如果您想为每个会话设置单独的实例,那么您必须将它们设置为 "not Shared" 并将您的代码更改为在会话中存储实例:

Session("Logger") = new Logger()

据我所知,在 ASP.NET 中通过会话允许单独的共享类没有任何“技巧”。

【讨论】:

  • 无法将其转换为会话编码,因为该类库也在类库中使用,该类库在winforms中使用也会导致问题。
【解决方案2】:

简短的回答是否定的。

VB 共享变量或 C# 静态变量是 AppDomain 范围的(出于实际目的,您可以将其视为进程范围),因此您只有一个值。

要为不同的 ASP.Net 会话设置不同的值,您必须将其放入 Session 字典中,这是没有办法的。

您可能还想查看线程问题。一般来说,ASP.Net 会同时处理请求,如果您有共享变量(即使在同一个会话中),可能会同时访问这些变量,并且您的代码需要是线程安全的。

【讨论】:

    【解决方案3】:

    现在我需要在类库中提供一个简单快速的解决方案。将类转换为模块。从所有变量和函数中删除了所有共享(静态)代码。到目前为止,这一切都与功能和编译一样。我希望数据交叉也应该得到解决。我会密切关注日志,看看它是否会再次发生,但我怀疑它会再次发生。

    我仍然更喜欢在 winforms 和 asp.net 中工作的另一种方法,以便我们将来可以转换为 C#。

    供参考更改版本的代码:

    Public Module Generic
        Public CurrentDeviceUniqueIdentifier As String
        Public TimeDiffFromServer As Long
        Public myLogger As Logger
    
    ....
    end Class 
    

    【讨论】:

    • 好吧,你能不能简单地保留旧类,并从该类中删除共享关键字?我假设您的代码必须在需要时创建了该类的实例 - 因此从该类的那些公共变量中删除共享关键字应该仍然有效。当然,如上所述,我假设您现有的代码创建了该类的一个实例,或者这非常建议您使用 shared 为项目创建全局变量。
    • 仅仅删除共享是行不通的,因为像记录器这样的对象在初始页面中被调用一次,但没有发送到函数或其他类。 Shared 用于全局变量定义是的。但是 IIS 使它成为导致问题的跨会话的全局性太多。只有另一种方法是我能想到的是将相同的参数添加到每个类并分配它,但这会导致大量代码更改。似乎模块是现在唯一的方法。希望有另一种方式。
    • 好吧,这不起作用,MODULE 与跨应用程序_domain 的共享(静态)相同,它被共享。我必须修改每个类以获取对象来存储记录器等常用共享项目。 class blah 将 myLogger 调暗为 Logger 并将其分配给类调用并分配它 sigh 这将需要一些时间。太烦人了,没有办法做到这一点。
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多