2010-09-16 4 views
7

Я собираюсь создать службу Windows на C#. Эта служба должна отслеживать события в системе и время от времени записывать некоторые данные в файлы. Эти текущие события образуют определенное состояние, поэтому я буду хранить состояние в памяти и обновлять его по мере поступления событий. Я не хочу чрезмерно усложнять ситуацию, поэтому я не хочу, чтобы состояние было постоянным на диске, но мне интересно, могу ли я как-то сделать его постоянным в памяти, так что если служба аварийно завершает работу (и автоматически перезапускается Windows), он мог бы подняться с того места, где он ушел, и продолжать (возможно, потерять некоторые события, а не большое дело).Сохранение постоянных данных в памяти

Я думал вдоль линии создания «общей» области памяти, что позволяло Windows управлять ею и использовать ее только в службе, но я не уверен, что объект будет сохраняться после того, как служба погибнет.

Любые идеи?

EDIT: Я не ищу решение для переполнения. Данные несколько важны, поэтому я хотел бы сохранить его в памяти до тех пор, пока служба не будет перезапущена, но данные не тоже. Это более приятная функция, если я могу легко переносить данные, не работая с файлами, внешними сторонними процессами и так далее. Мое идеальное решение было бы простой встроенной функцией (в .NET или Windows), которая предоставит мне некоторую настойчивость в памяти, просто для восстановления после аварийного события.

+0

Оформить заказ: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) класс –

ответ

3

Вы можете использовать постоянный блок кеширования от Microsoft Enterprise Library.

Он настраивается, и вы можете использовать многие магазины поддержки, такие как база данных и изолированное хранилище.

+0

Ницца, это выглядит очень интересно, спасибо! –

0

Как насчет использования изолированного хранилища и сохранения объекта в памяти таким образом?

+0

Можете ли вы подробно остановиться на« изолированном хранилище »? –

+1

Посмотрите ссылку http://ondotnet.com/pub/a/dotnet/2003/04/21/isolatedstorage.html – Madeleine

+0

Спасибо, что обогатили мои знания. Однако это также записывает файлы - и у меня нет никаких проблем с разрешением, поэтому изолированное хранилище не добавляет значения моей ситуации. –

2

Вы можете использовать Memcached или Redis (который также сохраняет данные на диске, но обрабатывает их автоматически).

http://code.google.com/p/redis/

Вы также могли бы взглянуть на этот вопрос:

Memcached with Windows and .NET

+1

Memcached и Redis интересно узнать об этом, но у меня такое чувство, что они будут излишним. Мне нужно хранить только несколько объектов с несколькими строками и целыми числами. Я мог бы сделать это с помощью взаимодействия с диском, но я предпочитаю взаимодействие с памятью по очевидным причинам. Я искал встроенную функцию в .NET или Windows. –

+0

Ну, вы можете попробовать, а затем решить, правильно ли ваше чувство ... в любом случае совет jmservera по использованию блока кэширования Persistenc может быть хорошим вариантом для вас. – mamoo

0

Даже если, например, вы храните данные на разделяемой памяти некоторых других сетевой ПК , как бы вы «гарантировали», что подключен к сети pc wont hang/restart/halt/etc? В таком случае ваша служба все равно потеряет сохраненные данные.

Я бы предположил, и, скорее всего, вы, скорее всего, закончите, сохранив данные на том же диске.

Обратите внимание, что из-за изменчивости памяти (ОЗУ) вы не можете перезагрузить данные, которые были там ранее, до перезапуска системы; если вы не используете какой-либо механизм для хранения/перезагрузки на диске.

--EDIT--

В этом случае, как об использовании MSMQ? Таким образом, вы можете выталкивать все по очереди, и даже если ваша служба получает перезагрузку, она будет искать элементы в очереди и продолжить дальше.

+0

Если тот же компьютер перезагружается, мне больше не нужны постоянные данные. Я хочу охватить только тот крайний случай, когда моя служба аварийно завершает работу и автоматически перезапускается. –

+0

@ Eldad: см. Мое редактирование в ответ на ваш комментарий. –

1

Я не понимаю, почему было бы труднее оставаться на диске.

с помощью db4o вы можете сохранить экземпляры, с которыми работаете.

+0

Это не сложно сохранить на диске. Мои данные очень просты, и я могу легко сериализовать их в файл и из него, я просто хочу, чтобы избежать беспорядка с диском, если это возможно. Данные не так важны; если я могу работать с ним все равно, но сохраняю память в безопасности (безопаснее ...) за короткий промежуток времени, когда сервис, к сожалению, перезагрузится, было бы здорово. –

+0

справиться с ожидаемыми сценариями отказа, избегая ненужного использования автоматического перезапуска и игнорируя его для экстремального сценария, который он по-прежнему терпит крах/после того, как вы уже сказали, что при перезапуске ящик не заботится о потере данных. – eglasius

+0

Ну, это надеется на лучшее :-) Очевидно, я не собираюсь писать, как будто мне все равно, выживет ли сервис. Я сделаю все, что в моих силах, и все-таки ... Но мне нужно взвесить расходы на сохранение данных. –

3

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

Я бы порекомендовал вам сохранить все состояние в одной иерархии объектов или объектов, сериализовать этот объект в XML и записать его в файл. Это действительно не намного проще.

+0

Я думаю, вы правы. Моя линия мышления была - это не ОЧЕНЬ важные данные, я могу жить с ее потерей. Если бы я мог подстроить что-то в своем коде, чтобы сделать его постоянным, пока моя служба идет вниз и обратно, не меняясь намного больше, мне это хотелось бы. –

+1

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

Смежные вопросы