C# IIS 7.5、线程敏捷性和静态变量的缺陷
我有一个在IIS(ASP.NET)中运行的应用程序,很多时候,页面会加载,但会呈现和填充与实际请求页面的用户不同的用户的信息。 用于呈现和填充页面的数据属于在大致相同的时间点发起请求的用户C# IIS 7.5、线程敏捷性和静态变量的缺陷,c#,asp.net,.net,iis,C#,Asp.net,.net,Iis,我有一个在IIS(ASP.NET)中运行的应用程序,很多时候,页面会加载,但会呈现和填充与实际请求页面的用户不同的用户的信息。 用于呈现和填充页面的数据属于在大致相同的时间点发起请求的用户 这可能是由于静态变量和我现在看到的所谓线程敏捷性造成的吗?如果您的代码真的是线程安全的,那么这不会发生 在这样的环境中使用静态变量可能是一个很好的调查起点 如果您指的是标记为ThreadStatic的任何内容,那么这也是一个很好的起点 要以任何具体方式提供帮助,您需要提供更多详细信息 包含用户特定数据的静态变
这可能是由于静态变量和我现在看到的所谓线程敏捷性造成的吗?如果您的代码真的是线程安全的,那么这不会发生 在这样的环境中使用静态变量可能是一个很好的调查起点 如果您指的是标记为
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
}
//错误-任何调用方都可以按任何顺序访问此文件
公共静态int CurrentUserId
{
得到;
设置
}
//好的,因为后备存储是安全的/分段的
公共静态int CurrentUserId
{
获取{return(int)会话[“CurrentUserId”];}
设置{Session[“CurrentUserId”]=value;}
}
//要共享的数据
公共静态列表要共享的某些值
{
//安全读取(如果正确初始化)
//只有在使用适当的锁时,才可安全书写
}
这不是线程敏捷性的问题,而是使用静态变量的问题。静态变量对于进程是静态的,而不是一个线程。因此,ASP.NET中的一个静态变量由向站点发出的每个请求共享。所以,问问自己:这个静态变量是要在每个请求者之间共享,还是特定于一个请求者?例如:
static int TotalPageHits; //Count the number of times a page has been requested
显然,这是一个非常好的数据,可以为所有用户共享。另一方面:
static string CurrentUserId; //DANGER WILL ROBINSON!!!!
要放入HttpContext.Current.Items中的特定于一个请求者的任何变量 这是一个相当模糊的描述。您如何登录用户以确定每个用户?您正在做什么来检索用户的状态?至于静态,它们是AppDomain级别的,这意味着在ASP.NET应用程序中可以有效地全局共享数据。如果您在static上存储任何特定于用户的状态,那么数据很可能会损坏。我很高兴知道,我不是唯一一个用“DANGER WILL ROBINSON”一词注释代码的人