Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
1

Асинхронное фоновое выполнения ряда действий

26.11.2012, 10:20. Просмотров 2909. Ответов 22
Метки нет (Все метки)

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

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

Вопрос
1) Где нужно это выполнять (как мне кажется Global.asax в событии Application_Start())
2) И как это нужно выполнять?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 10:20
Ответы с готовыми решениями:

Фоновое выполнения операций
Добрый день. На сайте выполняется ряд методов которые обращаются к другим...

Калькулятор для выполнения арифметических действий с обыкновенными дробями
Создать web-форму (aspx) Задание:создать дробный калькулятор. Калькулятор для...

Асинхронное отображение картинок
Суть в том что я не могу сформулировать предложение для поисковых запросов -...

Асинхронное обновление Partial view
Суть примера в следующем: 1. Есть один единственный совсем не хитрый...

Асинхронное отображение данных из XML файла
Добрый день. У меня заждание: Отобразить данные из XML файла, сделать форму...

22
Grey_1
82 / 82 / 14
Регистрация: 09.04.2012
Сообщений: 199
26.11.2012, 10:27 2
Цитата Сообщение от ayrat_net Посмотреть сообщение
1) Где нужно это выполнять (как мне кажется Global.asax в событии Application_Start())
Есть такая штука как Job на SQL сервере. Она дает возможность виполнять действия над табличками в указаное время, или что то такое похожее

Цитата Сообщение от ayrat_net Посмотреть сообщение
2) И как это нужно выполнять?
Если jobs то наверно TRANZACT SQL
1
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
26.11.2012, 10:41  [ТС] 3
про job знаю, просто про таблицы привел пример чтобы лишних вопросов не было для чего вообще мне это нужно. к сожалению работа идет не чисто с табличными данными
0
Grey_1
82 / 82 / 14
Регистрация: 09.04.2012
Сообщений: 199
26.11.2012, 10:48 4
Цитата Сообщение от ayrat_net Посмотреть сообщение
(как мне кажется Global.asax в событии Application_Start()
Application_Start точно не канает. Он срабатываэт только когда запускается сайт. Тоесть только один раз
Нужно вибрать другое событие из
Может даже Application_BeginRequest. Ну и где то сохранять время последнего обновления
1
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
26.11.2012, 10:52  [ТС] 5
И да совсем забыл с тем что Вы предлагаете есть одна небольшая проблема ели речь идет только об обработке табличных данных. если это делать внутри базы данных это вероятно быстродействененнее, но к сожалению она как я понимаю привязана к внутреннему языку базы данных, для mssql это t-sql а для oracle это pl-sql если я не ошибаюсь, хоть все они похожи но вероятно в синтаксисе некоторые различия всё же есть, что не есть удобно есть придется перемещать из одной базы данных в другую придется вникать в тонкости каждого из этих языков
И второй момент, JOB если не ошибаюсь имеет несколько привязок для выполнения главная из которых, возможно и единственная периодичность по неким временным промежуткам, что тоже не есть оптимально, потому что часто могут потребоваться и другие критерии момента срабатывания той или иной функции.
0
Grey_1
82 / 82 / 14
Регистрация: 09.04.2012
Сообщений: 199
26.11.2012, 10:56 6
Тогда только из программы выбирайте себе событие из поста выше
1
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
26.11.2012, 10:58  [ТС] 7
Цитата Сообщение от Grey_1 Посмотреть сообщение
Application_Start точно не канает. Он срабатывать только когда запускается сайт. Тоесть только один раз
Почему же не канает? - моя функция должна выполняться на стороне системы с некой переодичностью и асинхронно, если поставить некий момент что он будет циклиться в промежутке времени и запустить так скажем этот цикл при старте приложения. как мне кажется должно всё работать

Цитата Сообщение от Grey_1 Посмотреть сообщение
Может даже Application_BeginRequest.
А вот это по мне точно не канает, если не ошибаюсь данное событие будет вызываться при каждом обращении на сервер любым пользователем, что как я понимаю создаст ужасный эффект скажем создастся куча потоков которые должны будут выполнить одну и ту же функцию.
0
Grey_1
82 / 82 / 14
Регистрация: 09.04.2012
Сообщений: 199
26.11.2012, 11:11 8
Цитата Сообщение от ayrat_net Посмотреть сообщение
при старте приложения
Так если при старте то канает, Но периоды или промежутки времени нет. Ви ж не будите перезапускать приложение один раз в день что б виполнилось событие
1
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
26.11.2012, 11:19  [ТС] 9
Цитата Сообщение от Grey_1 Посмотреть сообщение
Ви ж не будите перезапускать приложение один раз в день что б виполнилось событие
Вот я и хочу до конца понять как работает Application_Start.
Ведь если так подумать и вправду может показаться что он срабатывает только один раз при старте, приложения. Но это как раз наводит на мысль ЧТО ТАКОЕ старт приложения, если так подумать то старт осуществляется только при заходе пользователя в приложение, а для этого определено событие Application_BeginRequest, то есть Application_Start работает как-то по другому. Поэтому у меня и возникли эти вопросы каким из событий пользоваться, если вообще пользоваться событием из глобал. А второй вопрос КАК, потому что я не работал ещё с асинхронностью с потоками, и созданием переодичности, хотя над этим буду работать и читать - это уже другой вопрос ...
0
xZooYx
120 / 101 / 9
Регистрация: 12.06.2012
Сообщений: 318
Записей в блоге: 12
26.11.2012, 11:23 10
В сервере Apache знаю есть такая штука (не помню уже как называется), типа шедулера, там прописываешь периодичность и страницу скрипта, которую нужно вызвать.
Возможно в IIS есть что-то похожее.
Идея насчет использования Application_BeginRequest тоже не плохая, просто (как вариант) нужно создать в приложении поле, которое будет хранить дату последнего обновления и при каждом запросе проверять, не прошло ли с эатой даты последнего обновления например сутки. При этом получается если нет обращений к севреру то и ваши действия никому не нужны и не выполняются, как только пользователь зашел - дествия выполнились. Ну а если пользователи постоянно заходят, по просто происходит проверка и выполняется в нужный момент.

Добавлено через 3 минуты
Application_Start срабатывает при старте приложения, то есть когда веб-сервер загружает сборку вашего сайта и запускает ее. Сайт можно остановить или перезапустить (тогда произойдут соответсвуюшие собития Application_End и опять Application_Start). Прилодение запускается и работает, а при заходе пользователя происходит событие Application_BeginRequest (как только от пользователя поишел запрос) и Application_EndRequest (как тлолько пользователю отправлен ответ).
2
Grey_1
82 / 82 / 14
Регистрация: 09.04.2012
Сообщений: 199
26.11.2012, 11:29 11
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DateTime? LastUpdate = null;
                public void Application_BeginRequest(object sendler, EventArgs e)
                {
                    // в теории тут стоит куча запросов в ожидании
                    lock ("lzlz")
                    {
                        // заходит одит поток
                        //проверяет временные условия если не канает то return
                        if ( /* || временные условия*/)
                            return;
 
                        //еще одна такая же проверка
                        if (/* || временные условия*/)
                        {
                            // что то сделать
 
                            // Когда етот поток виполнится lock пропадает и 
                            // первое временное условие делает return
                        }
                    }
                }
В неактивном варианте потоки все по очереди попадают в лок, простая булевская операция думаю не вызовет временных проблем.
Правда в момент выполнения действий (смотря каких) может появится ефект подвисания,
Нужно использовать асинхронность

Нужна консультация эксперта, проблема актуальна
1
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
26.11.2012, 11:36  [ТС] 12
Цитата Сообщение от xZooYx Посмотреть сообщение
по просто происходит проверка и выполняется в нужный момент.
Я конечно же разделяю эту идею и понимаю её. но суть скрипта служит для того чтобы распределить нагрузку на память и процессор в общем чтобы данная функция выполнялась к примеру ночью чтобы во время массового посещения не производилось каких то лишних работ по анализу и обработке масивов данных. А само понятие что множество пользователей будет проверять настало ли то время чтобы выполнять функцию анализа и обработки данных вероятно сметет всю благую цель для чего я это делаю. Да и представьте настанет тот самый момент и допустим ночью сидит 10 пользователей и допустим 2 пользователя обновляют страницу в один и тот же момент первый в любом случаи выполнит действие, а второй получается перевыполнит, хотя да можно поставить флаг или опять какие то дополнительные моменты чтобы функция не срабатывала, но это всё же что-то лишнее по мне. Если в ASP MVC это делать нельзя проще написать приложение на первых порах в консольке и держать постоянно запущеным, но тут же возникает проблема если проект хранится на хостинге, хотя вероятно не пробовал ещё можно всё это запилить на облако, но на сколько это возможно я пока не знаю, имею ввиду запускать там сторонние приложения не веб проект.

Добавлено через 3 минуты
Grey_1,
За lock спасибо - хотя давненько xитал об этом.
А в асинхронности надо разбираться по этому поводу эксперты могут только подсказать, но за меня никто это делать не будет
0
xZooYx
120 / 101 / 9
Регистрация: 12.06.2012
Сообщений: 318
Записей в блоге: 12
26.11.2012, 11:46 13
Ну если вам надо ночью... Тогда варианата имхо только два. Искать и использовать какой то IIS шедулер. Или при старте приложения запускать отдельный поток, в кортом будет работать ваше приложение, делающее на фоне какие то действия. Но надо помнить, что приложение может быть остановлено и запущено в произвольный момент, соответственно дату последнего выполнения нужно хранить в файле или в базе данных.
1
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
26.11.2012, 11:58  [ТС] 14
xZooYx,
Спасибо
Цитата Сообщение от xZooYx Посмотреть сообщение
IIS шедулер.
Поищу, но все же не особо хочется держать всю логику в одном месте а не прописывать дополнительную документацию

Цитата Сообщение от xZooYx Посмотреть сообщение
Или при старте приложения запускать отдельный поток
Вот это я примерно и хочу сделать но пока не знаю как во первых в каком событии, во вторых надо понять что такое старт веб приложения и его окончание. ведь как все правильно заметили что по сути поток как бы не может существовать без запущенного приложения. а компиляция и запуск приложения по сути могут считаться стартом приложения, а как вот быть если проект выложен на хостинг. когда именно там осуществляется первый старт приложения. А если он и осуществился, то его надо видеть что он работает ведь по сути как я и оворил поток не может существовать при не запущенной программе.

Цитата Сообщение от xZooYx Посмотреть сообщение
Но надо помнить, что приложение может быть остановлено и запущено в произвольный момент
За этот момент спасибо я совсем не задумывался об этом ...
0
xZooYx
120 / 101 / 9
Регистрация: 12.06.2012
Сообщений: 318
Записей в блоге: 12
26.11.2012, 12:35 15
Поток нужно запускать в событии Application_Start, собственно у вас особо вариантов то нет. Приложение стартует когда сайт запускают в IIS. Завершиться приложение может либо когда его остановят в IIS. Еще... есть такая тема, что если к приложению долго нет обращений, оно останавливается. Но вот тут не знаю, происходит ли при этом завершение приложения или оно как то ставиться на паузу. Запускается оно вновь при первом пришедщем запросе.
1
ayrat_net
82 / 82 / 12
Регистрация: 12.01.2011
Сообщений: 1,049
26.11.2012, 12:42  [ТС] 16
xZooYx,
Спасибо. Теперь всё понятно, что и как делать ...
0
kenny69
burning1ife
1411 / 1232 / 292
Регистрация: 21.09.2008
Сообщений: 3,407
Записей в блоге: 9
27.11.2012, 13:40 17
мне кажется, что решение использовать Application_BeginRequest для
Цитата Сообщение от ayrat_net Посмотреть сообщение
в определенное время каждого дня (то есть циклом срабатывающем например раз в сутки) необходимо выполнять ряд действий (например с таблицами баз данных) в асинхронном фоновом режиме
это просто тихий ужас. если job не устраивает, то можно просто сделать windows service, наример так.
1
HIMen
4261 / 1428 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
30.11.2012, 06:48 18
Quartz.Net
1
Moonshine
43 / 43 / 7
Регистрация: 09.10.2012
Сообщений: 147
02.12.2012, 14:42 19
Может просто запустить таймер,вызывающей по интервалу нужный метод? Запускать можно из любого события, а если таймер уже запущен, просто ничего не делать.

Время последнего выполнения задания можно хранить в Cache. Кэш хранится и после выключения приложения.

Application_Start вызывается при первом обращении к сайту, на сколько я понимаю, потому что iis просто так поднимать приложение от того, что оно выложено на хостинг не будет.
0
apande
17 / 17 / 2
Регистрация: 19.09.2012
Сообщений: 92
05.12.2012, 00:22 20
Тут много интересного на эту тему
1
05.12.2012, 00:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2012, 00:22

Фоновое наполнение БД
Здравствуйте. Пишу что-то типа почтового клиента. Смысл в том что пользователь...

Как поставить фоновое изображение на дочернюю форму MasterPage
Доброго времени суток! Уже несколько дней тревожат кошмары, не могу поставить...

Порядок выполнения действий
static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru