#asp.net #performance #initialization #pageload
#asp.net #Производительность #инициализация #загрузка страницы
Вопрос:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) { // sadly, **never** in here }
MyInit() // Slow initialization method, that I only wan't to call one time.
}
Итак, если я не могу вставить свой MyInit()
в if
, могу ли я решить проблему с производительностью / структурой с помощью OnNeedDataSource()
?
Комментарии:
1. Так является ли MyInit статическим методом?
Ответ №1:
Не совсем уверен, что это то, что вы имеете в виду, но чтобы инициализировать что-то один раз из Page_Load , вы могли бы использовать статический класс со статическим bool, чтобы определить, было ли это инициализировано. Учитывая, что он находится в Page_Load , вам также потребуется защита от нескольких потоков — поэтому используйте блокировку с двойной проверкой, чтобы сделать ее потокобезопасной и защитить от состояния гонки.
public static class InitMe
{
private static bool isInitialized = false;
private static object theLock = new Object();
public static void MyInit()
{
if(!isInitialized)
{
lock(theLock);
{
if(!isInitialized) // double checked lock for thread safety
{
// Perform initialization
isInitialized = true;
}
}
}
}
}
и в вашем Page_Load вызовите его через InitMe.MyInit()
Надеюсь, это поможет.
Комментарии:
1. Выглядит очень интересно, я обязательно попробую.
2. Я не могу выполнить свою инициализацию, потому что я в статическом методе. Я пытаюсь немного изменить ваш пример, но я не знаю, насколько хорошо это будет тогда.
3. Можете ли вы превратить его в синглтон?
4. Да, я это сделал. Но проблема все еще существует. Потому что страница — это страница из моего большого левого меню.. Итак, когда я нажимаю другую страницу меню, а затем возвращаюсь на эту страницу, она должна выполнить инициализацию снова. Итак, я предполагаю, что мне нужно снова установить
isInitialized
значение false, когда я перейду к другому меню, верно?5. Но все же, возможно
OnNeedDataSource()
, это правильный путь.
Ответ №2:
Попробуйте это:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!Page.IsPostBack) { MyInit(); }
}
Я предполагаю, что вы находитесь на странице или пользовательском элементе управления…
HTH.
Комментарии:
1. IsPostBack также всегда имеет значение true здесь, поэтому я не буду работать, если я что-то не пропустил?
2. У меня никогда не было проблем с !Page. IsPostBack при первой загрузке страницы; это должно вызываться при первой загрузке страницы… Может быть, здесь есть какая-то пользовательская настройка, о которой нам нужно знать? Кроме того, не могли бы вы опубликовать пример кода большего размера?
3. Хорошо, я мог бы создать образец, потому что это не просто отдельная страница. страница находится в меню. Я где-то читал на SO, что страница, вызывающая ее самостоятельно, всегда будет иметь значение IsPostBack true.