我有一個用戶控件顯示來自數據庫的信息。這個用戶控制必須不斷更新這些信息(比如說每5秒鐘)。此用戶控件的幾個實例在運行期間以單個頁面的形式以編程方式生成。在這個用戶控件的後面代碼中,我添加了一個代碼,它向數據庫發送查詢以獲取所需的信息(這意味着用戶控件的每個實例都這樣做)。但是這似乎減慢了查詢的處理速度,所以我正在創建一個靜態類,它將查詢信息並將其存儲在其變量中,並讓我的用戶控件的實例訪問這些變量。現在我需要這個靜態類來每5秒鐘執行一次查詢來更新它的變量。我嘗試使用一個新的線程來做到這一點,但變量似乎並沒有更新,因爲每當我從不同的類訪問它們時,我總是得到一個NullReferenceException。如何讓靜態類不斷更新自己的變量?
這裏是我的靜態類:
public static class SessionManager
{
public static volatile List<int> activeSessionsPCIDs;
public static volatile List<int> sessionsThatChangedStatus;
public static volatile List<SessionObject> allSessions;
public static void Initialize() {
Thread t = new Thread(SetProperties);
t.Start();
}
public static void SetProperties() {
SessionDataAccess sd = new SessionDataAccess();
while (true) {
allSessions = sd.GetAllSessions();
activeSessionsPCIDs = new List<int>();
sessionsThatChangedStatus = new List<int>();
foreach (SessionObject session in allSessions) {
if (session.status == 1) { //if session is active
activeSessionsPCIDs.Add(session.pcid);
}
if (session.status != session.prevStat) { //if current status doesn't match the previous status
sessionsThatChangedStatus.Add(session.pcid);
}
}
Thread.Sleep(5000);
}
}
而且這是我正在試圖訪問我的靜態類變量:
protected void Page_Load(object sender, EventArgs e)
{
SessionManager.Initialize();
loadSessions();
}
private void loadSessions()
{ // refresh the current_sessions table
List<int> pcIds = pcl.GetPCIds(); //get the ids of all computers
foreach (SessionObject s in SessionManager.allSessions)
{
SessionInfo sesInf = (SessionInfo)LoadControl("~/UserControls/SessionInfo.ascx");
sesInf.session = s;
pnlMonitoring.Controls.Add(sesInf);
}
}
任何幫助,請?由於
mmm ...我懷疑只要初始化函數完成,線程t就會被殺死,因爲t的範圍是函數。你可能想要像singleton模式。 –
我猜這裏沒有人注意到你正在運行越來越多的後臺線程 - 每次調用你的'Initialize'頁面並啓動一個新線程(並且不要告訴我你打算告訴所有用戶永不刷新該頁面,或者如果另一個用戶正在使用該應用程序,則不使用該應用程序,直到IIS回收所有內容)。你最終會遇到一堆線程,而你沒有互斥/監視器/鎖。我不確定'volatile'可以將線程分配給靜態字段之外的其他線程沒有觀察到已更改的值並體驗到'null'時檢測我的編輯 –