我们有一个类库项目用于保存我们的基本数据定义,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会话。
答案 0 :(得分:0)
静态类和数据在ASP.NET会话之间共享。期。更改为Module
不会改变问题,因为_ethingthing"在Module
中共享。如果您希望每个会话都有单独的实例,那么您必须制作它们"而不是Shared
"并将您的代码更改为在会话中存储实例:
Session("Logger") = new Logger()
没有" hack"我知道在ASP.NET中通过会话允许单独的共享类。
答案 1 :(得分:0)
简短的回答是否定的。
VB共享变量或C#静态变量是AppDomain范围的(出于实际目的,您可以将其视为进程范围),因此您只有一个值。
要为不同的ASP.Net会话设置不同的值,您必须将它放在Session字典中,没有办法解决这个问题。
您可能还想查看线程问题。一般来说,ASP.Net进程并发请求,如果你有共享变量(即使在同一个会话中),可能会同时访问,你的代码需要是线程安全的。
答案 2 :(得分:0)
现在我需要在类库中使用简单快速的解决方案。将类转换为模块。从所有变量和函数中删除了所有共享(静态)代码。截至目前,它在功能和编译方面都起作用。我希望也应该解决数据交叉问题。我会密切关注日志,看看它是否会再次发生,但我怀疑它会发生。
我仍然喜欢在winforms和asp.net中运行的另一种方法,以便将来转换为C#。
参考更改版本的代码:
Public Module Generic
Public CurrentDeviceUniqueIdentifier As String
Public TimeDiffFromServer As Long
Public myLogger As Logger
....
end Class