| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка под ASP.NET > Как выполнить код 1 раз? |
| Автор: alir 14.10.2005, 16:24 |
| Мне нужно, чтобы некоторая часть кода выполнилась 1 раз (при 1 запуске странице), остальная - неважно. Есть такое свойство? |
| Автор: arilou 14.10.2005, 16:28 | ||
выполнится один раз |
| Автор: alir 14.10.2005, 16:58 | ||
| Не все так просто. Если помесить код в postback вот что происходит:
Ошибка: Object reference not set to an instance of an object. Если же код с заполнением list'a из postback вытащить, но оставть в PageLoad, то сначал все пройдет наромально, но потом он, после действий с формой, вылетет с ошибкой: The process cannot access the file "..." because it is being used by another process. А вылетает при создании StreamReader reader = file.OpenText(); - потому и хотел его выполнять 1 раз. |
| Автор: Mad 14.10.2005, 17:57 | ||
код чтения, тебе всетаки придеться выполнять при каждом обращении к странице, вот только внимательно помотри, после чтения ты вызываеш reader.Close() или нет ? |
| Автор: alir 14.10.2005, 18:00 |
| Mad Конечно, вызываю. Вот только потоки каким-то образом накладываются. |
| Автор: Mad 14.10.2005, 18:10 |
| alir Вообщето не имеет значения, вызываеш или нет (сори, перед этом я просто прикололся С обновлением файлов в ASP.NET вообще тяжко работать (не не расыитана она на это, предпологаеться что все будет через базы идти). Если ты храниш какието данные в файле, то представь себе ситуацию, один юзер только заходит на страницу,а второй ее уже обновляет. И как системма будет одновременно читать, и перезаписывать один и тотже файл ? |
| Автор: alir 14.10.2005, 18:47 | ||||
Свел проблему к миниму:
после 4-5 выполнения это функции вылетает ошибка:
Вылетает на: StreamReader reader2 = file.OpenText(); Почему??? Накладываются потоки? |
| Автор: Mad 14.10.2005, 18:54 | ||||||
Попробуй так :
а то у тебя закрытие стрима не всегда выполнялось ;) (не во всех if ветках) но этот код всеравно будет работать неустойчиво, при заходенескольких пользователей на эту страницу, он будет давать туже ошибку. Чтоб этого избежать можеш попробывать так (хотя и немного коряво
|
| Автор: alir 14.10.2005, 19:53 | ||
Mad
Ну вроде работает, правда, если быстро нажимать, начинает долго думать. Все же спасибо. |
| Автор: Mad 15.10.2005, 12:34 | ||
от этого тебе не уйти (толко переход на БД). |
| Автор: arilou 17.10.2005, 16:03 | ||||||
Так. Налицо некоторое непонимание жизненного цикла страницы. Как известно, HTTP - протокол "без состояния". Всякие session, view state и проч. - это уже навороты каждой отдельно взятой среды (ASP.NET, PHP, Java, etc). В ASP.NET страница проходит следующие этапы в своем жизненном цикле: 1. Page init 2. Page load 3. Обработка postback'ов (если они были) 4. Page pre-render 5. Page unload После п.5 страница перестает существовать. Инстанса твоего class MySuperPage : System.Web.UI.Page уже нет. Поэтому, 1. Инстансы всех классов (list = new ArrayList();!!!!!) должны создаваться при каждой инициализации страницы. 2. Другое дело - заполнение контролов значениями и data binding - это должно происходить только в те моменты, когда это тебе нужно. Например, при первом обращении к странице (if(!IsPostBack)) Далее, ты работаешь с файлом. Как правильно заметил Mad, в веб-приложении это совсем не хорошо, потому что веб-приложение априори многопоточное, и программировать под него надо принимая это во внимание. Так что тебе нужно использовать какой-то механизм синхронизации доступа к файлу. Иначе будет:
Переходи на работу с БД. Если же ну никак без файла, то тогда хотя бы не давай нескольким пользователям его модифицировать, иначе будешь получать ошибки
Вот такие, брат, дела. |