Я должен заблокировать доступ к членам экземпляра?
Пример:
public class HttpModule : IHttpModule
{
//...
Dictionary<int, int> foo;
void UseFoo(int a, int b)
{
foo[a] = b;
}
}
Это не совсем ясно для меня до сих пор из документации MSDN, но я нашел сообщение на форуме от кого-то, кто утверждает, что знает ответ. Похоже, вы не должны ожидать плохих вещей произойдет с вашей реализацией,но вы должны знать, что состояние foo
не обязательно будет общим для всех результатов, поскольку ваш HttpModule
будет создан один раз для HttpApplication
, который IIS решит сохранить в своем пуле.
Недавно я нашел статью, которая слегка затрагивает этот вопрос: 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;
}
}
}
}
Я собирался создать тестовое приложение, чтобы запустить это и проверить, так ли это, но у меня не было времени.