Как избежать повторного вызова метода инициализации в ASP.NET? - PullRequest
0 голосов
/ 28 мая 2011
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()?

Ответы [ 2 ]

1 голос
/ 28 мая 2011

Не совсем уверен, что это именно то, что вы имеете в виду, но чтобы инициализировать что-то один раз из 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()

Надеюсь, это поможет.

0 голосов
/ 28 мая 2011

Попробуйте это:

protected override void OnLoad(EventArgs e)
{
   base.OnLoad(e);

   if (!Page.IsPostBack) { MyInit(); }
}

Я предполагаю, что вы находитесь на странице или в пользовательском элементе управления ...

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...