Как сделать, чтобы последующие экземпляры сборки совместно использовали одну и ту же память? - PullRequest
4 голосов
/ 10 ноября 2011

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

Я знаю, что могу записать на диск или в базу данных, но это для процесса, который используется с SQL-запросами и который, вероятно, слишком сильно замедлит его (на самом деле я собираюсь протестировать эти опции, но я спрашиваю этот вопрос пока что б / с не думаю, что это будет приемлемое решение).

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

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

Заранее спасибо за любые предложения!

Редактировать: Похоже, я упустил очень простое решение. Моя проблема заключалась в том, что SQL предоставлял только 8000 байт пространства для сериализации данных между вызовами агрегатной функции SQL, которую я написал. Я прочитал статью о том, как сжать ваши данные и извлечь максимальную пользу из этих 8000 байтов, и предположил, что больше ничего не могу поделать. Как оказалось, я могу установить MaxBytes = -1 вместо диапазона от 0 до 8000, чтобы получить до 2 ГБ пространства. Я считаю, что это было что-то новое, что они добавили в платформу 3.5, потому что есть разные статьи, в которых говорится об ограничении в 8000 байт.

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

Ответы [ 3 ]

5 голосов
/ 10 ноября 2011

Вы не можете сохранить их как данные в памяти и распределить их между процессами, поскольку каждый процесс имеет свое собственное изолированное адресное пространство памяти.

Однако одним из вариантов будет использование * 1003.* .NET Memory-mapped file Поддержка «хранения» общих данных.Это позволит вам написать файл, содержащий информацию в месте, к которому может получить доступ каждый процесс.

2 голосов
/ 10 ноября 2011

Каждый процесс имеет свое собственное адресное пространство. Вы не можете просто поделиться переменной, как вы намеревались

Вы можете использовать разделяемую память , хотя.

Если вы используете .NET 4, вы можете просто использовать Файлы с отображением в памяти

1 голос
/ 10 ноября 2011

Если вам нужен какой-то подсчет или блокировка для всей машины, вы можете изучить использование именованных объектов синхронизации, таких как семафор - http://msdn.microsoft.com/en-us/library/z6zx288a.aspx или мьютексы http://msdn.microsoft.com/en-us/library/hw29w7t1.aspx. Когда указано имя, такие объекты являются машиннымиширокий, а не весь процесс.

...