Как мне избежать повторного вызова моего метода инициализации в ASP.NET ?

#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.