none
Хранение данных Application (ASP.NET) RRS feed

  • Вопрос

  • protected void Application_BeginRequest(object sender, EventArgs e)
        {
                Application.Lock();
                Application["counter"] = (int)Application["counter"] + 1;
                Application.UnLock();
    }

    есть код,работает верно

    если убрать методы Lock, Unlock,то будет работать неверно, так как все одновременные подключения (несколько пользователей вошли в систему), сколько бы их ни было, приводят к увеличению состояния приложения лишь на единицу. Для того чтобы избежать этой проблемы, возможно применение методов Lock() и Unlock(), которые позволяют одновременно получить доступ к коллекции только одному клиенту.

    что происходит в приложении когда нет этих двух методов. Как происходит ошибка? Вот допустим вошли 2 пользователя,а дальше что? как так увеличилось всего на единицу кол-во вхождений? 1й пользователь начал вып-ть запрос,увеличил  

    Application["counter"]

    на 1,а со 2 что происходит в этот момент?

    28 октября 2013 г. 8:25

Ответы

  • "что происходит в приложении когда нет этих двух методов. Как происходит ошибка? " - несколько потоков попытаются получить доступ к объекту, что приводит к повреждению данных. Чем больше количество запросов тем выше вероятность. В случае двух пользователей это маловероятно, но всё же. Если одновременно оба читают счётчик, то количество не увеличивается. А если оба записыают одновременно, то значение счётчика может оказаться намного меньше ожидаемого.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа V_Ald 28 октября 2013 г. 9:33
    • Снята пометка об ответе V_Ald 28 октября 2013 г. 16:48
    • Предложено в качестве ответа YatajgaEditor 29 октября 2013 г. 6:06
    • Помечено в качестве ответа YatajgaEditor 30 октября 2013 г. 6:20
    28 октября 2013 г. 9:01
    Модератор
  • Каждый запрос одновременно обрабатывает один поток из пула. Счётчик пользователей это всего лишь статический разделяемый объект в памяти. Допустим имеем два запроса одновременно, соответственно и два потока: A и B. Блокировка не используется. Поток A читает данные, допустим что счётчик равен 0 в начале. Тем временем поток B тоже читает 0, поток A тем временем увеличивает его на один, получается - 1. Но поток B тоже одновременно записывает значение 1 в тот же объект, заменяет его. Имеем значение 1, вместо 2. Но если будет использоваться блокировка, то поток B не начнёт чтение до тех пор, пока поток A не обновит данные счётчика.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа V_Ald 28 октября 2013 г. 18:49
    28 октября 2013 г. 18:21
    Модератор

Все ответы

  • "что происходит в приложении когда нет этих двух методов. Как происходит ошибка? " - несколько потоков попытаются получить доступ к объекту, что приводит к повреждению данных. Чем больше количество запросов тем выше вероятность. В случае двух пользователей это маловероятно, но всё же. Если одновременно оба читают счётчик, то количество не увеличивается. А если оба записыают одновременно, то значение счётчика может оказаться намного меньше ожидаемого.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа V_Ald 28 октября 2013 г. 9:33
    • Снята пометка об ответе V_Ald 28 октября 2013 г. 16:48
    • Предложено в качестве ответа YatajgaEditor 29 октября 2013 г. 6:06
    • Помечено в качестве ответа YatajgaEditor 30 октября 2013 г. 6:20
    28 октября 2013 г. 9:01
    Модератор
  • а когда они оба записывают одновременно что конкретно происходит там?? можно поподробнее? как происходит работа счетчика,когда он увеличивать начинает?и что конкретно делает каждый из пользователей?

    вот 2 пользователя решили увеличить счетчик на 1 и как они это делают? оба залезают в 1 поток?



    • Изменено V_Ald 28 октября 2013 г. 16:49
    28 октября 2013 г. 16:42
  • Каждый запрос одновременно обрабатывает один поток из пула. Счётчик пользователей это всего лишь статический разделяемый объект в памяти. Допустим имеем два запроса одновременно, соответственно и два потока: A и B. Блокировка не используется. Поток A читает данные, допустим что счётчик равен 0 в начале. Тем временем поток B тоже читает 0, поток A тем временем увеличивает его на один, получается - 1. Но поток B тоже одновременно записывает значение 1 в тот же объект, заменяет его. Имеем значение 1, вместо 2. Но если будет использоваться блокировка, то поток B не начнёт чтение до тех пор, пока поток A не обновит данные счётчика.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа V_Ald 28 октября 2013 г. 18:49
    28 октября 2013 г. 18:21
    Модератор