未来读者的更新:如果您发现此文本太长:由于静态变量,这是竞争条件.您正在阅读的内容显示,对于正在调试它并忽略static关键字的人来说,这会让您感到困惑.如果您遇到类似的行为,请先检查static.
我正在调试此应用程序,但无法在代码中找到错误.我的母版页的类有一个名为的私有属性Greeting.在同一服务器上的两个用户几乎同时注销(不到一秒钟)之前,此属性不会造成麻烦.然后一个用户获得了另一个用户的问候语(例如,如果John和Jane正在测试,他们都会看到"Dear Misses Jane!").因此,出于调试目的,我为此属性实现了一个getter和setter.两者都写入读取或写入trace.axd的值HttpContext.Current.Trace.Write().我看到设置了正确的值.但在最后get,读取相应的其他用户的值.连续两次调用getter会返回不同的值.中间没有调用setter.该属性是私有的,并且显示代码分析,不会从其他任何地方引用它.我也正在使用堆栈跟踪写入跟踪Environment.StackTrace.代码按预期运行.这与.NET本身的错误有什么不同?
private static string _Greeting = String.Empty;
private static string Greeting
{
get
{
System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__get(): " + _Greeting);
System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__get() STACKTRACE: " + Environment.StackTrace);
return _Greeting;
}
set
{
_Greeting = value;
System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__set(): " + _Greeting);
System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__set() STACKTRACE: " + Environment.StackTrace);
}
}
Run Code Online (Sandbox Code Playgroud)
跟踪摘录(带假名):
Debug myMasterPage.Greeting__get(): Dear Misses Jane
Debug myMasterPage.Greeting__get(): Dear Mister John
Run Code Online (Sandbox Code Playgroud)
问题在于这个变量是static因为当一个用户登录并且设置了值时,另一个用户登录并更改它.所以你知道,静态变量是在所有线程(请求)之间共享的变量,并且很少有你想要在Web应用程序上声明静态变量的情况.
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |