2012-05-26 2 views
2

Я рассматривал возможность приостановки и возобновления приложения .Net в последнее время, особенно с прицелом на возможность приостановки приложения, сохранения его состояния , и запустите его позже.Пользовательский хост CLR - приложение «Пауза»/«Резюме»

Я смотрел варианты, предоставленные путем написания пользовательского хоста CLR, тайного искусства, чтобы быть уверенным. Похоже, что пользовательский хост может предоставить свои собственные реализации для задач, управления памятью, блокировок и т. Д. Таким образом, похоже, что я мог бы создать собственный хост CLR, который может приостановить и возобновить приложение через ICLRTask, m не уверен, что предоставленные интерфейсы имеют достаточно крючков для приостановки всех задач, сохранения всего состояния программы на диск и последующего оживления приложения в дальнейшем. Может кто-то окончательно сказать мне, что это вообще невозможно? Я также не возражаю, если это возможно только для небольшого подмножества приложений, мне просто интересно узнать о возможностях здесь.

+1

Для начала я ничего не знаю о пользовательских хостах CLR, так что это все предположения. Думая о том, как он может работать, я думаю, что это будет работать только для подмножества приложений. Это происходит из-за таких вещей, как дескрипторы файлов или другие системные ресурсы, которые могут отсутствовать при возобновлении программы. Либо ваш хост, либо ваше приложение должны быть достаточно умны, чтобы знать, чтобы попытаться повторно запросить эти внешние ресурсы. И если вам нужно внести изменения в свое приложение для поддержки хоста, я не думаю, что вам нужен хост в первую очередь, потому что ваше приложение может приостановить и возобновить себя в любом случае. – Steve

+0

Что касается Foundation Workflow Foundation (http://msdn.microsoft.com/en-us/netframework/aa663328.aspx)? Это позволяет остановить работу и быть сериализованной, что будет продолжено позже. Красивые фотографии здесь: http://msdn.microsoft.com/en-us/library/dd851337.aspx. – Govert

+0

@ Govert Я чувствую себя скорее о Workflow Foundation. Что-то, что меня заинтересовало во всем этом разговоре, было ссылкой о концепции постоянных итераторов. Немного взломанный, но я думаю, что смогу сделать с ним что-то хорошее ... Ссылка здесь: http://dotnet.agilekiwi.com/blog/2007/05/implementing-workflow-with-persistent. html –

ответ

3

Извините, что на вашем параде вас ждет дождь, но это не полетит. Интерфейс ICLRTask был добавлен в экспресс-запросе от команды SQL Server. Они поддерживают хост SQLCLR, пользовательский хостинг CLR, чтобы программисты могли писать управляемый код в хранимых процедурах. Они попросили команду CLR разбить жесткую связь между управляемым потоком и потоком операционной системы ProcessThread в текущей структуре. С целью реализации управляемых потоков как волокон, основной особенностью SQL Server в то время.

Этого на самом деле не произошло, они не смогли получить его достаточно надежным и отказались от проекта. И проект быстро исчерпал причины, чтобы заставить его работать, волокна не подходят для многоядерных процессоров со своим собственным кешем L1.

У кого нет heckofalot, чтобы сделать то, что вы пытаетесь выполнить. Безусловно, самый жесткий гайка для взлома, помимо надежного захвата состояния процесса, заключается в том, что вы действительно не имеете дело с потоками, выполняющими собственный код. В частности, тип, который выдает функцию winapi и блокирует драйвер ядра для завершения запроса ввода-вывода. Вы не можете захватить состояние ядра, и у вас нет крючка. Добавление крючков к маркеру пинвака сделает его слишком медленным. Hibernate - это системная функция, она не может быть функцией процесса.

+0

Спасибо за отличную информацию! Я видел падение функции SwitchOut, но я думал, что это было реализовано в более поздних версиях. Вы получите мой голос за надежный ответ только на это! –

2

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

Это сообщение в блоге от Miguel может быть хорошим началом http://tirania.org/blog/archive/2008/Jan-29.html и содержит еще несколько ссылок на видео в LANG.NET, где обсуждалась работа Second Life on Mono.

Некоторые дополнительные подсказки о том, что именно было сделано from another post:

В 2006 году Джим из LindenLabs представил работу, которую они сделали в SecondLife для поддержки microthreading.

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

Для этого им нужна была система, которая отслеживала бы целую цепочку стека вызовов, локальные переменные и параметры, а также возможность приостанавливать код в любой точке.

Джим сделал это с помощью механизма перезаписи CIL, который ввел сериализацию состояния и реинкарнацию в существующий поток инструкций CIL. Он подробно рассказал о своей технологии в своем разговоре с Lang.NET в 2006 году.

Технология появилась в производстве в 2008 году, и сегодня эта структура продолжения обеспечивает 10 миллионов монографий на SecondLife.

+0

Это тоже волнует! Спасибо за ссылки. Возможно, это точно не отвечало на мой вопрос, но это точно отвечало моим намерениям. Я обязательно просмотрю это внимательно ... –

+0

спасибо! Таким образом, похоже, что в то время было сделано две аналогичные работы: некоторые из них по имени Томи, а некоторые - Linden Labs. Работа Томи (которая не поддерживала сериализацию изначально) была подобрана и сфальсифицирована в Mono.Tasklets.Continuations (http://www.mono-project.com/Continuations). Тем не менее, я не уверен, что поддержка сериализации была добавлена. Вы знаете, если это так? Если нет, любой намек, если Linden Labs выпустит свою версию Mono? Я делал небольшой рыть, но ничего до сих пор ... –

+0

Я не уверен, что это похоже. Продолжения в основном дают вам сантехнику для async, как C# 5 реализует под обложками. Сериализация времени выполнения значительно сложнее. Вы можете задать в списке Mono dev: http://lists.ximian.com/mailman/listinfo/mono-devel-list. – Govert