Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как(где) создать поток, который работает, после окончания проложения? 
:(
    Опции темы
Pankon
Дата 11.7.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Как(где) создать поток,  который работает после окончания приложения, и его не сьест "сборщик мусора"?

 
PM MAIL   Вверх
DeadSoul
Дата 11.7.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



Цитата(Pankon @  11.7.2006,  12:28 Найти цитируемый пост)
Как(где) создать поток,  который работает после окончания приложения, и его не сьест "сборщик мусора"?

1. Зачем?
2. Это невозможно 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
ivashkanet
Дата 11.7.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(DeadSoul @  11.7.2006,  12:33 Найти цитируемый пост)
2. Это невозможно 

Поясню: приложение считается работающим, пока работает хотя бы один запущенный им поток smile 
Цитата(DeadSoul @  11.7.2006,  12:33 Найти цитируемый пост)
1. Зачем?

То же хотел бы знать?
Это вопрос из серии: "Хочу чтобы мое приложение работало после окончания работы"

Добавлено @ 12:37 
Или вопрос такой: "... потк работающий после закрытия гавной формы приложения"? 
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(DeadSoul @  11.7.2006,  12:33 Найти цитируемый пост)
Зачем?
Цитата(ivashkanet @  11.7.2006,  12:36 Найти цитируемый пост)
То же хотел бы знать?

Задача родилась из АСП проекта, в котором, пользователи должены с веб страницы запускать "серверное" приложение(разные экземпляры) и "закрывать" сессию. А запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу. (Серверный application тоже может быть остановлен...)







ПС. Может надо виндовс службы организовывать, но я здесь абсолютно не селен smile. И вообще можно ли "запускать" разные экземпляры одной службы из программы передав им разные входные параметры? (Надо другой топик начать...)
 
PM MAIL   Вверх
DeadSoul
Дата 11.7.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
 И вообще можно ли "запускать" разные экземпляры одной службы из программы передав им разные входные параметры? (Надо другой топик начать...)

Нет.

 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Pankon
Дата 11.7.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(DeadSoul @  11.7.2006,  13:33 Найти цитируемый пост)
Нет.

Что делать то  smile    smile  smile  smile  smile 
 
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
Задача родилась из АСП проекта, в котором, пользователи должены с веб страницы запускать "серверное" приложение(разные экземпляры) и "закрывать" сессию. А запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу. (Серверный application тоже может быть остановлен...)

Вообще, это лучше делать силами ASP .Net (ИМХО, ничем от win приложений не отличается, только сразу заточена под многопоточность).

А если хочешь под WinForm, то делай одно постоянно работающее приложение, которое будет раздавать потоки всем юзерам (хотя это все уже реализовано в ASP).
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
Серверный application тоже может быть остановлен...

на то он и серверный, что всегда включен. Остановишь его и все, никто к нему доступа не получит smile 
Правда можно сделать отключение при простое, но все равно приложение много не съест ресурсов (в рамках сервера, а не домашнего компа). Так что об этом не стоит заботиться 
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(ivashkanet @  11.7.2006,  13:43 Найти цитируемый пост)
Вообще, это лучше делать силами ASP .Net
Цитата(ivashkanet @  11.7.2006,  13:43 Найти цитируемый пост)
хотя это все уже реализовано в ASP
 Так все-таки - как (примерный сценарий please)?

 
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Не понял?
ЛЮБАЯ ASP .Net страница ---- приложение работающее на стороне сервера.
Которое запускается отдельно для каждого пользователя.
В ней можно  делать что хочешь (хоть удалить все файлы на компе, хоть выключить его  smile )
Срочно читать инфу про ASP .Net 
Литература по .Net
Или в Гугл
Удачи  smile  
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



ivashkanet, 
Цитата(ivashkanet @  11.7.2006,  14:15 Найти цитируемый пост)
Которое запускается отдельно для каждого пользователя.
В ней можно  делать что хочешь
 это - то понятно, а вот как
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
в котором, пользователи должены с веб страницы запускать "серверное" приложение(разные экземпляры) и "закрывать" сессию. А запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу
 и это тогда, когда пользователь уже давно выключил комп ... и.... спит(уже пару часов).

 
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.7.2006,  14:38 Найти цитируемый пост)
запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу

Ясно, не будут же они стопаться не доделав работу smile 
Так, вопрос
Где должны крутиться приложения? На сервере?
Наверное да, ведь 
Цитата(Pankon @  11.7.2006,  14:38 Найти цитируемый пост)
 пользователь уже давно выключил комп ... и.... спит(уже пару часов).


Добавлено @ 14:47 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
не будут же они стопаться не доделав работу

А еще можно, ИМХО, передать работу работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток.
P.S. А еще лучше, подождать людей, которые с этим сталкивались. А то я сейчас насоветую... smile 
Хотя, на мой взгляд, все нормуль smile  
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
не будут же они стопаться не доделав работу
 да они долго будут на сервере крутиться и пользователь не дождется подтверждения..., а потом БУХ и timeout их прикончит и сессию закроет, вот тут то юзер и получит "подтверждение"...  smile 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
На сервере?
 Угу...
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
передать работу работающему (всегда, если нет, то запускаем его) приложению
... smile Вопрос примерно про это и был ... Так Как(где) создать -то ?

Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
А еще лучше, подождать людей, которые с этим сталкивались.
 Люди..... . .  .    .      .

 

Это сообщение отредактировал(а) Pankon - 11.7.2006, 15:06
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.7.2006,  15:03 Найти цитируемый пост)
Так Как(где) создать -то ?

Я знаю только так  smile 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
А еще можно, ИМХО, передать работу работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток.


Добавлено @ 15:10 
Цитата(Pankon @  11.7.2006,  15:03 Найти цитируемый пост)
 да они долго будут на сервере крутиться

Что ты там такое делать то собрался?
На несколько часов???
Не могу себе представить 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 11.7.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Обычно делается спец. табличка в базе данных, куда складывается последнее состояние юзверя (viewstate или что там может быть в асп.нет), а на сервере работает windows service, который с заданной периодичностью удаляет самые старые записи из этой таблички. Windows service элементарно пишется, в студии шаблон есть. 


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 11.7.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(mr.DUDA @  11.7.2006,  15:54 Найти цитируемый пост)
удаляет самые старые записи из этой таблички
 мне нужно именно работающий поток(или экземляр работающего приложения(робота)) на сервере, который делает свою работу и умирает, когда все сделает. Каждый экземпляр такого "серверного робота" получает входные параметры из асп страницы (точнее с пользовательской страницы), но это не вопрос...
Вопрос где и как хранить(запускать) такой робот. В сессии - не пойдет.. юзер закрывает броузер и идет спать, а робот должен работать...
В СерверАппликатион, говорят тоже может быть остановлен, не зависимо от присутствия серверных переменных(читай запущенных потоков)...
Создавать виндовссервисе(несколько - один для каждого юзера) и передовать ему параметры говорят - не возможно 
Цитата(DeadSoul @  11.7.2006,  13:33 Найти цитируемый пост)
Нет.


Поэтому
Как(где) создать поток, который работает, после окончания приложения(сессии)?

 smile 
 smile 
 smile 
  

Это сообщение отредактировал(а) Pankon - 11.7.2006, 16:19
PM MAIL   Вверх
mr.DUDA
Дата 11.7.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Pankon @  11.7.2006,  16:19 Найти цитируемый пост)
Создавать виндовссервисе(несколько - один для каждого юзера) и передовать ему параметры говорят - не возможно 

А я говорю - возможно. Создай сервис и общайся с ним из ASP.NET-приложения через ремоутинг. Список сессий (объектов) храни в статическом Dictionary в windows service.

Добавлено @ 16:56 
Неужели пример нужен ?  


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 11.7.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.7.2006,  16:19 Найти цитируемый пост)
Как(где) создать поток, который работает, после окончания приложения(сессии)?

Я ж тебе говорил уже: 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
А еще можно, ИМХО, передать работу работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток

Этим приложением можно сделать Win-сервис
Передавать данные приложению можно так:
Цитата(mr.DUDA @  11.7.2006,  15:54 Найти цитируемый пост)
 табличка в базе данных, куда складывается последнее состояние юзверя

 
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(mr.DUDA @  11.7.2006,  16:55 Найти цитируемый пост)
через ремоутинг. Список сессий (объектов) храни в статическом Dictionary в windows service.
Цитата(mr.DUDA @  11.7.2006,  16:55 Найти цитируемый пост)
Неужели пример нужен ?  
 А вот и Да.

Цитата(ivashkanet @  11.7.2006,  16:57 Найти цитируемый пост)
после окончания приложения(сессии)?

Цитата(ivashkanet @  11.7.2006,  16:57 Найти цитируемый пост)
работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток
 Что ты подразумеваешь под "приложение"(работающеее)? я блин в конец запутался...

Цитата(ivashkanet @  11.7.2006,  16:57 Найти цитируемый пост)
Этим приложением можно сделать Win-сервис
 А несколько..?  smile 
 
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.7.2006,  17:20 Найти цитируемый пост)
 А несколько..?   

Зачем тебе несколько? Одного хватит. 
Какая разница сколько их, если они могут создать сколько угодно потоков smile 
Цитата(Pankon @  11.7.2006,  17:20 Найти цитируемый пост)
"приложение"(работающеее)

Запущенное, работающее в режиме ожидания. 
Получило задание --- запустило поток --- ждет.
Получило ответ от потока --- обработало ---- опять ждет. 
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(ivashkanet @  11.7.2006,  17:26 Найти цитируемый пост)
Запущенное, работающее 
 Я так и не понял: АСП-приложение, вин-приложение, вин-сервисе (свой вариант)
 
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Как вижу ситуацию я:
АСП-приложение --- пишет в базу (не могу придумать нормальный способ взаимодействия двух разных приложений smile ). Написало --- забыло.
Win-сервис (зачем доп память на визуализацию жрать). Временами сканирует базу на наличие новой заявки.
Есть заявка --- запускаем поток на ее обработку --- ждем новые заявки.
Получили ответ от потока --- обрабатываем ---- опять ждет. 
Вот так. Что непонятно? 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 11.7.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Сел за пример, и тут простая мысль пришла в голову: а что мешает в рамках ASP.NET-овского приложения стартануть поток, ответственный за задачи "вне страницы" ? Пусть он живёт столько, сколько нужно, и управляет пользовательскими сессиями.

З.Ы. ASP.NET - это кстати сам по себе windows service, под которым стартуют потоки (из пула), выводящие каждую страницу. 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 11.7.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  11.7.2006,  17:57 Найти цитируемый пост)
Сел за пример, и тут простая мысль пришла в голову: а что мешает в рамках ASP.NET-овского приложения стартануть поток, ответственный за задачи "вне страницы" ? Пусть он живёт столько, сколько нужно, и управляет пользовательскими сессиями.

У меня тоже были такие мысли, а потом подумал (с подачи Pankon). А не закроется поток, при закрытии сессии
 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 11.7.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @  11.7.2006,  20:45 Найти цитируемый пост)
 А не закроется поток, при закрытии сессии

Одно другого никак не касается. Есть процесс (aspnet_wp.exe или w3wp.exe), запущенный в нём поток ведёт себя точно так же как в любом другом приложении - 100% проверено. 


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 11.7.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(mr.DUDA @  11.7.2006,  17:57 Найти цитируемый пост)
в рамках ASP.NET-овского приложения стартануть
 а как же 
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
(Серверный application тоже может быть остановлен...)
 
PM MAIL   Вверх
mr.DUDA
Дата 12.7.2006, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Pankon @  11.7.2006,  23:55 Найти цитируемый пост)
(Серверный application тоже может быть остановлен...)

Ну остановишь ты IIS, ну и что ? Хочешь, чтобы всё продолжало работать, а смысл ? 


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 12.7.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Хорошо.

Тогда.... Ближе к телу, как сказал Мапасан.

Есть класс(Klass) с конструктором, который принимает один(..) входной параметер. У класса есть метод, который, в принципе, и делает всю работу, есть свойство, показывающее сосояние класса(обьекта).

Как организовать потоки 
Цитата(mr.DUDA @  11.7.2006,  17:57 Найти цитируемый пост)
в рамках ASP.NET-овского приложения
 которые запускаются по "вызову" пользователей(с веб-стр) и принимают(см. конструктор) параметер(ы) от пользователя. При этом, поток при окончании работы "освобождает от себя (во сказалsmile )"  ASP.NET-овское приложение. 
И (для админ веб-страницы)была бы возможность во время работы потоков опрашивать их "численность", а так же в каждом потоке иметь возможность "прочитать" то свойства, которое показывает сосояние класса(обьекта).

Вот примерно такая задача. Может, конечно, я что-то не правильно описал, но принцип, я думаю, понятен.

На вопрос: Неужели примеры нужены ?  Отвечаю: А вот и ДА.



 
PM MAIL   Вверх
mr.DUDA
Дата 12.7.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Pankon, лови пример.

Создаём веб-сайт с двумя страницами: UserPage.aspx, AdminPage.aspx. На юзерпейдж кидаем текстбокс для имени пользователя (всё по-простому) и Label для вывода информации о состоянии (например, будем туда тайм-аут выводить), на админпейдж - таблицу Table, куда выведем список пользователей и тайм-ауты.

Добавляем классы WorkItem.cs и WorkItemManager.cs: первый будет представлять тот самый объект, о котором ты говоришь, с состоянием пользователя и его тайм-аутом. В нём же будет крутиться поток данного пользователя. Второй класс будет хранить коллекцию всех активных WorkItem-ов в виде Dictionary<имя_пользователя,WorkItem>. Список существует в единственном экземпляре, поэтому WorkItemManager сделаем синглетоном.

При каждом заходе на страницу UserPage будем проверять, есть ли у WorkItemManager-а WorkItem для данного пользователя (по введённому логину) и будем отодвигать тайм-аут на 30 секунд вперёд. При заходе на страницу AdminPage берём список пользователей и выводим инфу, полученную из WorkItem-а каждого пользователя.

UserPage.aspx.cs
Код
using System;

public partial class UserPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.TextBoxUserName.Text == string.Empty)
            this.LabelMyState.Text = "(введите имя пользователя и нажмите OK)";
        else
        {
            // определяем имя пользователя
            string userName = this.TextBoxUserName.Text;

            // получаем WorkItem по имени пользователя
            WorkItem workItem = WorkItemManager.Instance.GetWorkItemForUser(userName);
            if (workItem == null)
            {
                // если такого нет - создаём новый
                workItem = new WorkItem("Начал работу");
                WorkItemManager.Instance.AddWorkItem(userName, workItem);
            }

            // отодвигаем тайм-аут на 30 секунд вперёд
            workItem.SessionTimeoutSeconds = 30;

            // выводим инфу из WorkItem-а
            this.LabelMyState.Text = workItem.ItemMessage;
        }
    }
}


AdminPage.aspx.cs
Код
using System;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class AdminPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // шапка таблицы
        TableRow row = new TableRow();
        TableCell cell1, cell2;
        cell1 = new TableCell();
        cell1.Text = "Имя пользователя:";
        cell2 = new TableCell();
        cell2.Text = "Секунд до таймаута осталось:";
        row.Cells.AddRange(new TableCell[] { cell1, cell2 });
        this.Table1.Rows.Add(row);

        // выводим список пользователей и таймаутов
        foreach (string userName in WorkItemManager.Instance.GetUserNames())
        {
            // получаем WorkItem по имени пользователя
            WorkItem workItem = WorkItemManager.Instance.GetWorkItemForUser(userName);
            if (workItem == null) continue;

            // добавляем строку в таблицу
            row = new TableRow();
            cell1 = new TableCell();
            cell1.Text = userName;
            cell2 = new TableCell();
            cell2.Text = workItem.SessionTimeoutSeconds.ToString();
            row.Cells.AddRange(new TableCell[] { cell1, cell2 });
            this.Table1.Rows.Add(row);
        }
    }
}


WorkItem.cs
Код
using System;
using System.Threading;

public class WorkItem
{
    /// <summary>
    /// Конструктор.
    /// </summary>
    public WorkItem(string initialMessage
        /* тут можно добавлять любые параметры */)
    {
        this.ItemMessage = initialMessage;

        // ставим начальный тайм-аут, чтобы поток сразу же не завершил работу
        this.SessionTimeoutSeconds = 30;

        // стартуем поток
        new Thread(this.WorkingThread).Start();
    }

    string _itemMessage;
    /// <summary>
    /// Какое-то свойство объекта.
    /// </summary>
    public string ItemMessage
    {
        get
        {
            return _itemMessage;
        }
        set
        {
            _itemMessage = value;
        }
    }

    int _sessionTimeoutSeconds;
    /// <summary>
    /// Сколько секунд осталось до тайм-аута.
    /// </summary>
    public int SessionTimeoutSeconds
    {
        get
        {
            return _sessionTimeoutSeconds;
        }
        set
        {
            _sessionTimeoutSeconds = value;
        }
    }


    ////////////////////////////////////////////////////////////
    //  тут можно добавлять другие свойства
    ////////////////////////////////////////////////////////////


    /// <summary>
    /// Событие "Работа окончена".
    /// </summary>
    public event EventHandler Finished;


    /// <summary>
    /// Рабочий поток WorkItem-а.
    /// </summary>
    void WorkingThread()
    {
        // "выполняем работу" до тайм-аута.
        while(this.SessionTimeoutSeconds > 0)
        {
            Thread.Sleep(1000);

            this.ItemMessage = "Осталось " + this.SessionTimeoutSeconds.ToString() + " секунд до тайм-аута";
            this.SessionTimeoutSeconds--;
        }

        // всё, типа сессия закрыта
        // сигнализируем о завершении работы WorkItem-а
        if (this.Finished != null)
            this.Finished(this, EventArgs.Empty);
    }
}


WorkItemManager.cs
Код
using System;
using System.Collections.Generic;

public class WorkItemManager
{
    // коллекция WorkItem-ов в виде словаря "имя пользователя - WorkItem"
    Dictionary<string, WorkItem> _workItems = new Dictionary<string, WorkItem>();

    /// <summary>
    /// Возвращает объект WorkItem для указанного пользователя.
    /// </summary>
    public WorkItem GetWorkItemForUser(string userName)
    {
        lock (_workItems)
        {
            if (_workItems.ContainsKey(userName))
                return _workItems[userName];
        }
        return null;
    }

    /// <summary>
    /// Добавляет объект WorkItem для указанного пользователя.
    /// </summary>
    public void AddWorkItem(string userName, WorkItem workItem)
    {
        lock (_workItems)
        {
            _workItems[userName] = workItem;
        }
        workItem.Finished += new EventHandler(workItem_Finished);
    }

    /// <summary>
    /// Возвращает список пользователей.
    /// </summary>
    /// <returns></returns>
    public Dictionary<string, WorkItem>.KeyCollection GetUserNames()
    {
        lock (_workItems)
        {
            return _workItems.Keys;
        }
    }
    

    /// <summary>
    /// Обработчик события Finished (WorkItem завершил работу).
    /// </summary>
    void workItem_Finished(object sender, EventArgs e)
    {
        // отписываемся от события Finished
        WorkItem workItem = (WorkItem)sender;
        workItem.Finished -= new EventHandler(workItem_Finished);

        lock (_workItems)
        {
            // находим имя пользователя и удаляем WorkItem из _workItems
            foreach (KeyValuePair<string, WorkItem> p in _workItems)
            {
                if (p.Value == workItem)
                {
                    _workItems.Remove(p.Key);
                    break;
                }
            }
        }
    }



    ///////////////////////////////////////////
    // делаем наш WorkItemManager синглетоном
    ///////////////////////////////////////////

    static WorkItemManager _instance;
    public static WorkItemManager Instance
    {
        get
        {
            if (_instance == null)
                _instance = new WorkItemManager();
            return _instance;
        }
    }

    internal WorkItemManager()
    {
    }
}


Полностью проект - в аттаче:
  

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  TestWebSite.zip 4,76 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 12.7.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(mr.DUDA @  12.7.2006,  12:11 Найти цитируемый пост)
Pankon, лови пример.

mr.DUDA,  лови звезду...


И "последние" вопросы. 
Синглетон таботает на уровне приложения smile  
Я останавливал сессию - он работает, я очищал аппликатион ..- он работает. Я останавливал - приложение - он не работает  smile 

Как таковой на синглетон не имеется обьектой ссылки...
Тут пробел в моих знаниях: Как сборщик мусора "общается" с синглетонами (Блин никигда не задумывался.) smile 

И где почитать?

Добавлено @ 14:32 
И еще вопрос в догонку.

Мой метод, который ваполняет "всю" работу не "спит", а довольно сильно ресурсы тянет. Нужно для него "приоритет" ставить или еще что.(Если каждый такой поток (40 штук  smile ) начнет ресурсы тянуть, то в выигрыше будет первый, ведь он первый на себя одеяло натянул(Ну это собственно был вопрос)) 
и еще
если в WorkItem.cs написать static метод, не будет проблем, если к нему будут обращаться разные потоки? 

Это сообщение отредактировал(а) Pankon - 12.7.2006, 15:06
PM MAIL   Вверх
mr.DUDA
Дата 12.7.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Pankon @  12.7.2006,  14:19 Найти цитируемый пост)
Синглетон таботает на уровне приложения   
Я останавливал сессию - он работает, я очищал аппликатион ..- он работает. Я останавливал - приложение - он не работает   

Как таковой на синглетон не имеется обьектой ссылки...
Тут пробел в моих знаниях: Как сборщик мусора "общается" с синглетонами (Блин никигда не задумывался.) 

Синглетон - это понятие из паттернов проектирования. Framework ничего не знает о паттернах. Поэтому смешивать в одну кашу синглетон и сборщик мусора - некрасиво smile. По сути вопроса, слово "синглетон" означает, что где-то в статической переменной класса хранится ссылка на объект. Раз в статической - значит, эта ссылка живёт, пока выполняется приложение; ASP.NET-приложение выполняется до тех пор, пока не остановлен IIS.

Собственно, сам синглетон WorkItemManager-а существует только для того, чтобы где-то можно было хранить список объектов WorkItem; потоки в моём примере выполняются в рамках объектов WorkItem. То есть, если к примеру даже убрать из проекта класс WorkItemManager, то ничего не мешает создавать "по одному" экземпляры WorkItem-ов и хранить ссылки на них где-нибудь в другой статической переменной класса.

Цитата(Pankon @  12.7.2006,  14:19 Найти цитируемый пост)
Мой метод, который ваполняет "всю" работу не "спит", а довольно сильно ресурсы тянет. Нужно для него "приоритет" ставить или еще что.(Если каждый такой поток (40 штук   ) начнет ресурсы тянуть, то в выигрыше будет первый, ведь он первый на себя одеяло натянул(Ну это собственно был вопрос)) 

Ресурсы равномерно распределяются между потоками. То есть если сделать 100 потоков - система будет тормозить равномерно между 100 потоками. По идее, нужно как-то ограничивать колическво потоков до 10-20, например используя класс ThreadPool. 


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 13.7.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(Pankon @  12.7.2006,  14:19 Найти цитируемый пост)
если в WorkItem.cs написать static метод, не будет проблем, если к нему будут обращаться разные потоки? 
 smile 
 
PM MAIL   Вверх
mr.DUDA
Дата 13.7.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Pankon @  13.7.2006,  09:59 Найти цитируемый пост)
если в WorkItem.cs написать static метод, не будет проблем, если к нему будут обращаться разные потоки? 

Ну, метод должен быть не static, т.к. сами WorkItem-ы создаются в множестве экземпляров (получить конкретный можно с пом. WorkItemManager.Instance.GetWorkItemForUser(userName)). А чтобы не было многопоточных неприятностей, достаточно в теле метода поставить оператор lock на любой объект. 


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 19.7.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Продолжаем разговор:

Расширяем задачу, описанную здесь следующим образом:
Есть несколько веб-серверов, один из них "центральный". Как, по команде(ам) "центрального" запустить на "дочерних" по одному(2,3,4..)  потоку(см. здесь), при этом иметь возможность, как и раньше, "опрашивать" численность всех "работающих" на серверах потоках и их состояние (админ старница). 

(Средствами .НЕТ) 


ПС. Новый топик, я думаю, нет смысла заводить... 

Это сообщение отредактировал(а) Pankon - 19.7.2006, 14:23
PM MAIL   Вверх
mr.DUDA
Дата 19.7.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Pankon, чем проще программа, тем лучше она работает ©

Упрощай решение задачи, или лучше продумай условие - возможно, всё проще чем ты думаешь, и не нужны все эти центральные и пр. потоки на сервере... 


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 19.7.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(mr.DUDA @  19.7.2006,  21:16 Найти цитируемый пост)
Упрощай решение задачи...
 Неполучается... Есть четыре (минимум) сервера, рапределенной работой на которых нужно управлять через WEB-интерфейс... (Всмысле, пользователь то об этом и не догадывается, а только получает информацию, что "процесс идет"... а позже проверяет результат работы(из БД)). 
Администратор должен иметь "расширенные" возможности, т.е. иметь возможность "наблюдать и управлять" процессами(на 4х серверах),  которые запустили пользователи...

Реализация для одного сервера практически готова.... Все работает... А вот, как "растянуть" это на на четыре IIS сервера пока что не знаю.
 
PM MAIL   Вверх
mr.DUDA
Дата 20.7.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Pankon, тогда пускай они (серверы) общаются между собой как обычный клиент-сервер. Самый простой и удобный способ - выставить наружу веб-сервис, управляющий потоками сервера и выдающий информацию о тек. состоянии сервера. 


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 20.7.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Спасибо.

Сегодня утром, поразмышляв немного, пришел тоже к выводу, что нужно организовывать Web service на каждом сервере....

Уже пишу Manager для центрального севера  smile  
PM MAIL   Вверх
Pankon
Дата 8.9.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(mr.DUDA @  11.7.2006,  23:37 Найти цитируемый пост)
Цитата(ivashkanet @  11.7.2006,  20:45 Найти цитируемый пост)
 А не закроется поток, при закрытии сессии

Одно другого никак не касается. Есть процесс (aspnet_wp.exe или w3wp.exe), запущенный в нём поток ведёт себя точно так же как в любом другом приложении - 100% проверено.  



Грабли....
Сервер 2003 прибивает поток через 20 минут работы.... smile
Сервер 2000 работает как часы - часами smile

Однако, что же такое с сервером 2003  smile 

 smile 



ПС. Пробовал менять timeout - результат - тот же
PM MAIL   Вверх
mr.DUDA
Дата 8.9.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Pankon @  8.9.2006,  16:58 Найти цитируемый пост)
Грабли....Сервер 2003 прибивает поток через 20 минут работы.... Сервер 2000 работает как часы - часами Однако, что же такое с сервером 2003

видимо, есть настройки типа Thread Pool в самом IIS под 2003-ю винду... там кстати и worker process по другому называется smile, w3wp.exe или что-то в этом роде...


--------------------
user posted image
PM MAIL WWW   Вверх
Yama
Дата 14.12.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 2.8.2006

Репутация: 2
Всего: 2



1. при работе он-лайн приложения у тебя ВСЕГДА работает веб-сервер(IIS, Apache или что-либо другое)
2. Зачем тебе переЦЦа в лоб, если можно с боку подойти? - Делаешь вин-службу или любое(хоть консольное) приложение, которому передаешь необходимые параметры запуска приложения любым удобным для тебя способом, т.е., по сути, юзер из своей сессии передает лишь параметры запуска нужного ему приложения в службу(или другое приложение), которое запускает нужное ему(юзеру), приложение и при этом оно не привязано к веб-серверу и, соответственно, к сессии юзера, т.к. запустила его совершенно другая служба(приложение).
--------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.5373 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.