Nano Hash - криптовалюты, майнинг, программирование

Синхронизируйте настройки между приложением форм и службой Windows (или любыми другими n-уровнями, на самом деле)

У меня есть служба Windows, которая выполняет ряд периодических действий, и я хочу изменить настройки этой службы из приложения Windows Forms. Однако я не уверен, как лучше всего убедиться, что в службе есть самые последние пользовательские настройки (как часто запускать, какие папки использовать для вещей, что еще может указать пользователь). Пользователь может изменить настройки в любое время по своему желанию, и я бы хотел, чтобы служба узнала об этом практически сразу. Вот варианты, которые я взвешиваю:

  1. Форма и общая папка службы используют один и тот же объект «Параметры» из третьего общего проекта, а форма использует вызов WCF «UpdateSettings (newSettings)», чтобы сообщить службе о внесенных изменениях (или, при желании, вызов обновите каждую индивидуальную настройку, хотя это похоже на много разных вызовов). В настоящее время я использую WCF для базовых сообщений, но объект настроек может быть огромным, поскольку там много других вещей.
  2. Форма и служба используют общий файл конфигурации (XML или тот же объект настроек из №1, но сериализованный на диск). Форма просто записывает новую копию объекта после того, как он был изменен, и служба время от времени проверяет и забирает его, если он новый, обновляя свою копию настроек.
  3. То же, что и №2, но с базовым вызовом WCF, который сообщает службе, что нужно получить настройки. По сути, версия №2 «по запросу» вместо «опроса».

Я знаю, что лучше всего это субъективно, но меня интересуют любые очевидные аргументы за или против такого выбора. Поскольку мне придется сохранять свои настройки между запусками приложения (перезагрузками и т. Д.), Мне все равно придется сериализовать настройки на диск, поэтому я уже склоняюсь к № 2 или № 3. Мне понадобится место на диске, где я могу сохранить настройки, но, возможно, папка AppData будет работать нормально, хотя это позволит только администраторам изменять настройки, поскольку они единственные, у кого есть разрешение на запись в это место. (где его может прочитать каждый пользователь, включая учетную запись службы).

Спасибо за понимание!


Ответы:


1

Я как бы использую твой номер 2.

Но я работаю только в .NET 2 со своим приложением, но оно все равно должно применяться.

У меня есть класс настроек, который я использую в своих двух программах. Внутри этого класса настроек я устанавливаю объект FileSystemWatcher, который смотрит на файл настроек.

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

Вы также можете применить тот же принцип на своем экране настроек, чтобы, если (служба) другое приложение обновляет что-либо во время редактирования настроек, это отражается на вашем экране.

Я использую AppData (каталог названий моей компании / приложения) для хранения файла.

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

Я использую этот подход в моем FileSystemWatcher, прежде чем продолжить

IPSDependency.FileSystem.WaitForLockOnFile(Me.mFilePath)

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

Public Shared Function IsLockAvailable(ByVal filename As String, ByVal fnfIsOK As Boolean) As Boolean
    Dim fi As FileInfo
    fi = New FileInfo(filename)
    Return IsLockAvailable(New FileInfo(filename), fnfIsOK)
End Function

Public Shared Function IsLockAvailable(ByVal theFile As FileInfo, ByVal fnfIsOK As Boolean) As Boolean
    Dim fs As FileStream
    Try
        If theFile.Exists Then
            fs = New FileStream(theFile.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
            fs.Close()
            Return True
        Else
            Return fnfIsOK
        End If
    Catch ex As IOException
        'we just let the exception go, because we are only testing the file rather than trying to use it.
        Return False
    End Try
End Function

Public Shared Sub WaitForLockOnFile(ByVal theFilename As String)
    WaitForLockOnFile(New FileInfo(theFilename))
End Sub

Public Shared Sub WaitForLockOnFile(ByVal theFile As FileInfo)
    Dim lockAvailable As Boolean
    If theFile.Exists Then
        While Not lockAvailable
            lockAvailable = IsLockAvailable(theFile, False)
        End While
    End If
End Sub
19.07.2010

2

Предполагая, что все работает на одном компьютере, как насчет этого:

  1. Определите общую структуру C #, которая определяет параметры. Этот файл .cs есть во всех проектах. Определите этот класс как структуру с StructLayout со значением Последовательный или Явный, чтобы его можно было напрямую сопоставить с неуправляемым общим объем памяти. Например:

    [StructLayout (LayoutKind.Sequential)] небезопасная структура MySharedSettings {public int setting1; общедоступный int setting2; общедоступная строка setting3; // добавляем сюда больше полей. }

  2. Используйте именованную общую память (также называемую файлы с отображением памяти). Это позволяет нескольким процессам на одном компьютере обмениваться данными без дополнительных затрат на удаленное взаимодействие или WCF. Общая память работает очень быстро и, в отличие от каналов, предлагает произвольный доступ к данным общей памяти. Служба создаст именованную общую память, а приложения пользовательского интерфейса откроют эту общую память. Вам нужно будет использовать pinvoke для использования базовых API Windows, но это не имеет большого значения.

  3. Приложения пользовательского интерфейса записывают MySharedSettings в общую память, а служба читает из общей памяти.

  4. Используйте именованный семафор и / или именованный мьютекс, чтобы защитить доступ к общей памяти и сигнализировать о доступности новых настроек. У службы есть выделенный фоновый поток, который просто выполняет WaitOne () для семафора, а поток пользовательского интерфейса будет сигнализировать о записи новых данных.

24.07.2010
  • Я чувствую, что могу многому научиться из этого ответа, но я изо всех сил пытаюсь найти хорошие примеры. Не могли бы вы предоставить их? 05.11.2014

  • 3

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

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

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

    20.07.2010

    4

    Я должен согласиться с вашей первоначальной склонностью к № 2 и № 3. Мне особенно нравится №3, так как я не фанат опросов, но в конечном итоге я думаю, что выбор между №2 или №3 будет определяться требованиями вашей службы.

    Что касается хранения пользовательских настроек, я бы рекомендовал изучить изолированное хранилище (http://msdn.microsoft.com/en-us/library/3ak841sy.aspx). Он предоставляет отличный механизм для безопасного, последовательного и надежного доступа к пользовательским файлам. Вам не придется беспокоиться о наличии у пользователя разрешения, если администратор полностью не отключил изолированное хранилище. Кроме того, если вы включите роуминг, пользователи могут даже взять свои настройки с собой, если они используют разные системы в одном домене, довольно приятно, правда?

    22.07.2010
  • Использование изолированного хранилища, по-видимому, зависит от пользователя - что касается моих настроек, они, по сути, зависят от компьютера. Я хочу, чтобы пользователи могли их просматривать, но только администратор может редактировать и повторно сохранять их (или, в Vista / 7, кто-то, кто использовал повышение прав администратора). Могу ли я использовать изолированное хранилище для локального администратора или хранилище типа «Все пользователи»? 23.07.2010
  • @rwmnau Дальнейшее изучение типов изолированного хранилища. Я вижу, что оно, как минимум, всегда ограничено пользователем, который его создал. Есть флаг IsolatedStorageScope.User, который, как я думал, можно отключить, но, похоже, это не так. Попробую придумать альтернативный маршрут. 23.07.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..