为未来的读者更新:如果您发现此文本太长:这是由于静态变量而导致的竞争条件。您在下面阅读的内容表明,对于正在调试它并忽略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);
}
}
踪迹摘录(化名):
Debug myMasterPage.Greeting__get(): Dear Misses Jane
Debug myMasterPage.Greeting__get(): Dear Mister John