我有一个在 IIS (ASP.NET) 中运行的应用程序,并且很多时候,页面加载但呈现并填充了与实际请求页面的用户不同的用户的信息。用于呈现和填充页面的数据属于同样在大致相同时间点发起请求的用户。
这可能是由于静态变量和我现在看到的被称为线程敏捷性的原因吗?
这不是线程敏捷性的问题,而是使用静态变量的问题。静态变量对于 PROCESS 来说是静态的,而不是一个线程。因此,向您的站点发出的每个请求都共享 ASP.NET 中的静态变量。所以,问问你自己:这个静态变量是要在每个请求者之间共享,还是只针对一个请求者?例如:
static int TotalPageHits; //Count the number of times a page has been requested
显然,这是为所有用户共享的完美数据。另一方面:
static string CurrentUserId; //DANGER WILL ROBINSON!!!!
您想要放入 HttpContext.Current.Items 的任何特定于一个请求者的变量。
包含用户特定数据的静态变量可以解释您所看到的行为。
线程敏捷性可能会加剧问题(例如,使其更明显或导致问题的不同表现形式,导致ThreadStatic使用问题等),但我将首先检查您对静态成员的使用。
// bad - any caller can access this in any sequence
public static int CurrentUserId
{
get;
set;
}
// okay, because the backing storage is safe/segmented
public static int CurrentUserId
{
get { return (int)Session["CurrentUserId"]; }
set { Session["CurrentUserId"] = value; }
}
// data that you want to be shared
public static List<string> SomeValuesToBeShared
{
// safe for reading (if properly initialized)
// safe for writing only if appropriate locks are used
}
如果你的代码真的是线程安全的,这不会发生......
在这种情况下使用静态变量可能是一个很好的调查起点......
如果您的意思是任何标记ThreadStatic
,那么这也是一个很好的起点......
为了以任何特定方式提供帮助,您需要提供更多详细信息...