2012-04-14 110 views
0

我有一个在IIS(ASP.NET)中运行的应用程序,并且有相当多的时间,页面加载但呈现并填充了与实际用户不同的用户信息请求该页面。 用于呈现和填充页面的数据属于也在大致相同时间点发起请求的用户。IIS 7.5,线程敏捷性和静态变量的缺陷

这可能是由于静态变量和我现在看到的称为线程敏捷性?

+2

这是一个非常含糊的描述。你如何登录用户来确定每个用户?你在做什么来检索用户的状态?至于静态,它们是AppDomain级别,这意味着数据在您的ASP.NET应用程序中全局共享。如果你将任何用户特定的状态存储在静态数据上,那么很可能数据损坏。 – 2012-04-14 19:59:45

回答

10

这不是线程敏捷问题,这是使用静态变量的问题。对于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的请求者的变量。

+2

我很高兴知道我不是唯一一个用“危险罗宾逊”这个短语来评论他们的代码的人。 – 2012-11-12 19:49:37

0

如果你的代码确实是线程安全的,这将不会发生......在这样的背景下

利用静态变量,可能一个很好的出发点调查...

如果你指什么标ThreadStatic那么这是一个很好的起点太...

要在您需要提供更多的详细信息任何具体的方式帮助...包含用户特定的数据解释行为

1

静态变量你一个重新看。

线程敏捷性可能会加剧问题(例如,使问题更明显或导致问题的不同表现形式,导致使用问题,等等),但我会先检查您对静态成员的使用情况。

// 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 
}