Является HttpModule общими для рабочими потоками?

Я должен заблокировать доступ к членам экземпляра?

Пример:

public class HttpModule : IHttpModule
{
    //...

    Dictionary<int, int> foo;

    void UseFoo(int a, int b)
    {
        foo[a] = b;
    }
}
7
задан TN. 11 April 2010 в 23:08
поделиться

2 ответа

Это не совсем ясно для меня до сих пор из документации MSDN, но я нашел сообщение на форуме от кого-то, кто утверждает, что знает ответ. Похоже, вы не должны ожидать плохих вещей произойдет с вашей реализацией,но вы должны знать, что состояние foo не обязательно будет общим для всех результатов, поскольку ваш HttpModule будет создан один раз для HttpApplication, который IIS решит сохранить в своем пуле.

4
ответ дан 7 December 2019 в 05:20
поделиться

Недавно я нашел статью, которая слегка затрагивает этот вопрос: http://www.dominicpettifer.co.uk/Blog/41/ihttpmodule-gotchas---the-init---method-can-get-called-multiple-times

В ней не упоминаются потоки, а только говорится, что рабочий процесс будет

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

Следуя коду из ссылки, вы можете быть уверены, что ваш код init выполняется один раз в потокобезопасной манере:

private static bool HasAppStarted = false; 
private readonly static object _syncObject = new object(); 

public void Init(HttpApplication context) 
{ 
    if (!HasAppStarted) 
    { 
        lock (_syncObject) 
        { 
            if (!HasAppStarted) 
            { 
                // Run application StartUp code here 

                HasAppStarted = true; 
            } 
        } 
    } 
}

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

1
ответ дан 7 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: