2012-04-14 133 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 
}