После редактирования вопроса я вижу, что допустимо отмену логического уровня. Если это так, можно попробовать следующий алгоритм.
1) Создайте службу с помощью InstanceContextMode=InstanceContextMode.PerSession
, чтобы гарантировать, что у вас есть тот же экземпляр службы для обслуживания последующих запросов.
2) для запуска новых сеансов используйте служебные операции, отмеченные OperationContract(IsInitiating = True)
3), создайте в качестве члена службы. не статично. это будет состояние обслуживания
CancellationTokenSource ct = new CancellationTokenSource();
4) внутри каждого метода обслуживания вам придется начинать новые вычисления внутри задач и помещать токен отмены в качестве параметра для этой задачи.
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ICalculator
{
[OperationContract(IsInitiating = True)]
Bool Begin()
[OperationContract(IsInitiating = false)]
double Add(double n1, double n2)
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculator
{
CancellationTokenSource cts = new CancellationTokenSource();
public double Add(double n1, double n2)
{
var cancellationToken = cts.Token;
var t = Task.Factory.StartNew(() => {
// here you can do something long
while(true){
// and periodically check if task should be cancelled or not
if(cancellationToken.IsCancellationRequested)
throw new OperationCanceledException();
// or same in different words
cancellationToken.ThrowIfCancellationRequested();
}
return n1 + n2;
}, cancellationToken);
return t.Result;
}
public Bool Begin(){}
}
Вот краткое описание сессий WCF .
Все примеры только с моей головы, не пробовали, если они действительно работают. Но вы можете попробовать.
Я собрал некоторый опыт в этой теме, когда я начал программировать на новом проекте в ноябре. Проект находится в поздней стадии теперь.
Для меня, следующее руководство по проектированию было важно:
Google Guice , поскольку контейнер DI был очевидным выбором - ясно наиболее хорошо думавший DI contianer с блестящими разработчиками и хорошим сообществом. Это выполняет все упомянутые выше пункты маркированного списка.
, Таким образом, я настроил свою основную стопку techology. Запущенный с Guice, добавил , в спящем режиме для персистентности (наряду с , деформация - сохраняется и сервлет деформации ). Затем я записал некоторым основным ДАО , который выбирает что-то.
Затем я пытался сделать следующее: добавленный другая веб-платформа вдобавок ко всему
я создал простую страницу с таблицей, заполненной ДАО, заголовками и текстовым полем со всеми четырьмя платформами.
Они были моими результатами при сравнении этих четырех платформ.
XSLT и XStream являются своего рода жестким подходом. Это не действительно платформа, но жизнеспособный techology абсолютно не сохраняющий состояние для высокоэффективных приложений. Это было безусловно самым быстрым способом служить тестовой странице. В режиме отладки, 3 мс на localhost по сравнению с приблизительно 30-50 мс с другим framworks.
интеграция Guice была относительно гладким и хорошим сервлетом деформации использования, который позволил мне ввести в сервлеты и вводит httprequest, httpresponse, сессию в других объектах, не раздавая их. Недостатки: никакое сообщество вообще, так как я - единственный человек, который рассмотрел бы этот стек. - никакие готовые к использованию компоненты.
Затем я смотрел на JSF и Guice: конечно, возможно поместить инжектор в контекст сервлета и облик использования как услуга локатор. С простым подходом невозможно ввести отступающие бобы где-то в другом месте. Используя пользовательский переменный сопоставитель решает это частично, но затем Вы теряете весь , интеграция IDE в Ваших файлах JSF плюс Вы должна будет использовать ужасный FQN для Ваших бобов поддержки или создать строку-> ключ Guice, отображающийся где-нибудь. Оба ужасны как:
виджеты деформации: Я создал свой простой пример с помощью этого для забавы; это - ранний альфа-этап. Было хорошо использовать, и его компоненты легко реализовать и снова использовать один. Это имеет целью предоставлять безопасному с точки зрения типов HTML идеальную интеграцию Guice. Так как было похоже, что это имело только одного активного разработчика тогда, который теперь propably работает над Guice 2.0, я сказал бы, что сообщество почти не существует. Это работало как очарование, было довольно быстро, но я буду альфа-тестером. Это было просто слишком опасно, чтобы я рассмотрел это для коммерческого проекта.
Калитка Apache: этот проект сначала удивил меня МОК калитки и калиткой-guice, объединяющейся в базовой загрузке. Инжекция конструктора в веб-страницах не возможна, только setter+field. Инжекция в веб-страницах Калитки легка, просто добавьте @Inject
к полям, которые Вы хотите заполнить - но Вы, как предполагается, не понимаете , как она работает в фоне . Хитрый случай материала. Инжекция веб-страниц теоретически возможна - но я не использовал ее однажды, так как это лишает возможности использовать смонтированные URL, плюс он смешает с, сохранился/сериализировал состояние. С введенными членами классов имеют дело прозрачно с сериализацией веб-страницы, которая необходима для включения спинки браузера. Использование калитки обнуляет внешние артефакты - просто немного конфигурации эти URL в классе приложений. Таким образом, вся конфигурация реализована в Java - который соответствует модели Guice хорошо. Четкое разделение HTML и Java. Это - открытый исходный код точно так же, как большинство компонентов, которые являются многочисленными и хорошего качества. Это вокруг с 2005(?) и является проектом Apache верхнего уровня. Хотя это - многофункциональная платформа, , API разумен компактный (все базовые классы помещаются в сингл JPEG на моем экране). В отличие от других, это не приносит собственный механизм МОК, а скорее думает о МОК как услуга, который может быть обеспечен [1 119], Платформа Spring , Guice, и т.д. и та философия делает это превосходящим w.r.t. Интеграция Guice. Я упоминал действительно умную и легкую поддержку Ajax?
Платформы, не глубоко оцененные: tapestry5 - приводит свой собственный МОК. Шов : не платформа самостоятельно, а meta-framwwork, который обычно comines Spring, JSF. Быть в спящем режиме. (Хотя Spring может теоретически быть заменен Guice.)
Сводка: из оцененного framworks Калитка Apache была явным победителем - относительно интеграции Guice + все другие упомянутые критерии.
Помимо нас два, у некоторых других людей была эта проблема прежде .
Калитке создали модуль Guice в , который я не использовал (но я использовал Калитка вполне немного и любил ее).
Хороший легкий веб-контейнер Прост . Это чрезвычайно производительно и может использоваться с платформами такой как Restlet и Джерси .