Въпросът беше актуализиран в голяма степен, така че имайте търпение...
Като се има предвид, че нито една нишка не се създава директно\индиректно от кода на вашия уеб метод:
Quesiton Значи вие не създавате изрично нови нишки или използвате ThreadPool нишки директно\индиректно, вие просто получавате извиквания към вашия уеб метод и изпълнявате кода си синхронно?
Отговор Да, прав сте. Има клиентски API, който извиква уеб услугата. След това уеб услугата управлява нишките автоматично (създава/разпределя и т.н.) в отговор на изискванията на клиента. Уеб услугата говори със смарт карта, като отваря множество сесии за криптиране/декриптиране.
По-полезно е да перифразирате първоначалния въпрос по реда на заявките, а не на нишките, напр.
Когато системната дата се промени, искам да рестартирам своето ASP.NET приложение и да се уверя, че всички заявки, които се изпълняват в момента, са изпълнени и че всички неизпълнени\заявки на опашка са завършен също.
Това се обработва автоматично, тъй като има концепция за опашка от заявки и активни заявки. Когато вашето ASP.NET приложение се рестартира, всички текущи и поставени на опашка заявки се изпълняват (освен ако не завършат своевременно), а новите заявки се поставят на опашка и след това се обслужват, когато се възстанови нов работен процес. Този процес се следва, когато рециклирате набора от приложения, към който принадлежи вашето ASP.NET приложение.
Можете да конфигурирате вашия набор от приложения за рециклиране в зададен момент в IIS Manager чрез настройките за рециклиране за свързания набор от приложения. Предполага се, че искате да направите това в 00:00 часа.
Актуализация
Мисля, че мога да разбера от вашите коментари, че трябва да стартирате код за почистване, когато всички заявки са обслужени и след това приложението е на път да се изключи. Трябва да поставите този код в глобалния манипулатор на събития Application_End.
Актуализация 2
В отговор на вашия актуализиран въпрос. Вашите изисквания са:
Когато приложението се рестартира:
- Нови заявки от клиенти се изчакват
- Текущата работа между уеб услугата и смарт картата трябва да приключи
- Ако има предишни чакащи заявки, те трябва да бъдат изпълнени.
Това се подкрепя от стандартния модел за рециклиране, който описах. Не е необходимо сами да се занимавате с нишки на заявки - това е един от стълбовете на ASP.NET framework, той се справя с това вместо вас. Той е ориентиран към заявките и абстрахира как се обработват заявките, т.е. обслужва се в множество нишки. Той управлява поставянето на заявки в нишки и управлява жизнения цикъл на тези заявки, когато приложението се рециклира.
Актуализация 3
Добре, мисля, че имаме последната част от сценария тук. Опитвате се да изключите ASP.NET от вашия клиент, като изпратите извикване на ЗАТВОРЕНА уеб услуга. По принцип искате да приложите свое собствено поведение при изключване на ASP.NET, като се уверите, че всички текущи и поставени на опашка заявки са обработени, преди да изпълните своя код за почистване.
Опитвате се да изобретите отново колелото.
ASP.NET вече има това поведение и се поддържа от:
а. Рециклиране на приложения Той ще обслужва чисто неуредените заявки и ще стартира нов процес за обслужване на нови заявки. Той дори ще постави на опашка всички нови заявки, които са получени, докато този процес продължава.
b. Application_End Глобален манипулатор на събития на приложение, където можете да поставите кода си за почистване. Той ще се изпълни след след като рециклирането се справи точно с вашите неуредени заявки.
Нямате нужда от вашата команда CLOSED.
Трябва да помислите дали да позволите на IIS да рециклира вашето приложение, тъй като има поддръжка за рециклиране в определено дневно време(а). Ако не можете да конфигурирате IIS поради причини за разполагане, тогава можете да използвате web.config, докосвайки, за да принудите рециклиране извън границите на IIS:
а. Имайте таймер, работещ в сървъра, който може да проверява за условието за промяна на датата и след това да докосне файла web.config.
b. Все още клиентът трябва да извика уеб метод CLOSED, но методът CLOSED просто докоснете файла web.config.
IIS, тогава a са най-желаните.
Честно казано Microsoft вече са мислили за това. :)
Актуализация 4
@Raj Добре, нека опитам да перифразирам това отново.
Вашите условия са:
- Имате изискване да нулирате вашата смарт карта веднъж на ден.
- Преди да нулирате вашата смарт карта, всички текущи заявки и заявки за уеб услуги, поставени на опашка, трябва да бъдат завършени, т.е. неизпълнените заявки.
- След като неуредените заявки бъдат изпълнени, нулирате вашата смарт карта.
- Всички нови заявки, които идват, докато се случва този процес, трябва да бъдат поставени на опашка и след това да бъдат обслужвани, след като смарт картата бъде нулирана.
Тези условия ви позволяват да завършите съществуващи заявки, да поставите на опашка всички нови заявки, да нулирате вашата смарт карта и след това да започнете да обработвате нови заявки, след като картата бъде нулирана.
Това, което предлагам е:
- Поставете кода за нулиране на вашата смарт карта в Application_End.
- Конфигурирайте IIS да рециклира вашето приложение в 00:00. Уверете се, че в разширените настройки за свързания набор от приложения сте конфигурирали Disable Overlapped Recycle = True.
- В 00:00 рециклирането на приложенията гарантира, че всички текущи заявки и заявки на опашка ще бъдат изпълнени.
- След 00:00 рециклирането на приложението гарантира, че всички нови заявки ще бъдат поставени на опашка, докато заявките в 3 са завършени и приложението изпълнява стъпки за изключване.
- След като заявките в 3 бъдат изпълнени, Applicaton_End ще бъде извикан автоматично. Това гарантира, че вашата смарт карта се нулира, след като всички текущи заявки бъдат изпълнени.
- Рециклирането на приложения гарантира, че вашето приложение се стартира отново в нов процес и че новите заявки, поставени на опашка в стъпка 4, започват да се обработват. Важното тук е, че вашият код за нулиране е бил извикан в 5.
Освен ако във вашия въпрос липсва някаква подробност, горното изглежда отговаря на вашите условия. Искате да направите x,y,z и ASP.NET има вградена поддръжка, която може да се използва за постигане на x,y,z и ви дава зрели, гарантирани и добре документирани реализации.
Все още се мъча да разбера защо говорите за теми. Правя многонишкова разработка, но говоренето за нишки вместо заявки, когато мислим за ASP.NET, добавя ненужна сложност към тази дискусия. Освен ако въпросът ви все още не е ясен.
Може би пропускате идеята, която подчертавам тук. Правя паралел между поведението, което изисквате, когато извикате CLOSED от вашето клиентско приложение, и това, което се случва, когато рециклирате приложение. Можете да използвате recycling и Application_End, за да постигнете необходимите резултати.
Опитвам се да ви помогна тук, тъй като опитът да приложите това поведение сам е ненужен и нетривиален.
person
Tim Lloyd
schedule
18.06.2010