У меня есть пользовательский элемент управления, который отображает информацию из базы данных. Этот пользовательский элемент управления должен постоянно обновлять эту информацию (скажем, каждые 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 относится к функции. вы, вероятно, хотите что-то вроде синглтон-паттерна. –
Я предполагаю, что никто здесь не заметил, что вы используете растущее число фоновых потоков - при каждой загрузке страницы вы вызываете «Initialize» и запускаете новый поток (и не говорите мне, что вы намерены рассказать всем своим пользователям никогда не обновлять страницу или не использовать приложение, если другой пользователь использует его, пока IIS не переработает все). Вы получаете беспорядок потоков, и у вас нет мьютексов/мониторов/замков. Я не уверен, что 'volatile' избавляет вас от ситуации, когда потоки, отличные от тех, которые присваивают значения статическим полям, не замечают измененного значения и не испытывают« null »- проверьте мое редактирование –