gpt4 book ai didi

.net - 在表单应用程序和 Windows 服务(或任何 n 层,真的)之间保持设置同步

转载 作者:行者123 更新时间:2023-12-04 17:58:45 24 4
gpt4 key购买 nike

我有一个执行许多定期事件的 Windows 服务,我想从 Windows 窗体应用程序更改此服务的设置。不过,我不确定确保服务中包含最新用户首选项的最佳方法(运行频率、用于事物的文件夹、用户可以指定的任何其他内容)。用户可以随时随意更改设置,我希望服务几乎立即知道它。以下是我正在权衡的选项:

  • 表单和服务共享使用来自第三个共享项目的相同“设置”对象,并且表单使用 WCF“UpdateSettings(newSettings)”调用让服务知道发生了更改(或者,可以选择调用更新每个单独的设置,尽管这在不同的调用中似乎很多)。我目前将 WCF 用于基本消息,但设置对象可能很大,因为那里还有很多其他的东西
  • 表单和服务使用一个通用的配置文件(XML,或来自 #1 的相同设置对象,但序列化到磁盘)。表单只是在对象更改后写入对象的新副本,服务会不时检查并拾取它,如果它是新的,则更新其设置副本
  • 与 #2 相同,但有一个基本的 WCF 调用,告诉服务去获取设置。本质上,是#2 的“按需”而不是“轮询”版本。

  • 我知道最好是主观的,但我对这些选择的任何明显的利弊原因感兴趣。由于我必须在应用程序运行(重新启动等)之间保存我的设置,所以无论如何我都必须将设置序列化到磁盘,所以我已经倾向于#2 或#3。我需要一个可以保存设置的磁盘位置,但也许 AppData 文件夹可以正常工作,尽管这只允许管理员更改设置,因为他们是唯一有权写入此位置的人(每个用户,包括服务帐户,都可以阅读它)。

    感谢您的洞察力!

    最佳答案

    我有点用你的2号。

    但我只在 .NET 2 中使用我的应用程序,但它仍然应该适用。

    我有一个在我的 2 个程序中使用的设置类。在此设置类中,我设置了 FileSystemWatcher查看设置文件的对象。

    如果设置文件被其他应用程序更新,我的当前会收到一个事件触发器,指示需要重新加载设置。

    您还可以在设置屏幕中应用相同的原则,以便如果(服务)其他应用程序在设置编辑期间更新任何内容,则会反射(reflect)在您的屏幕中。

    我使用 AppData(我的公司/应用程序名称目录)来存储文件。

    要记住的另一件事是,在写入文件时可以锁定文件,因此您可以使用临时名称保存、删除旧、重命名临时方法,或者在读取文件后对文件进行一些保护性锁定filewatcher 事件触发已进行更改。

    我在我的 FileSystemWatcher 中使用了这种方法在继续之前

    IPSDependency.FileSystem.WaitForLockOnFile(Me.mFilePath)

    代码是这样的。 (现在阅读本文后,可能有更好的方法我在这里使用一些 sleep 来减少 CPU 抖动)
    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

    关于.net - 在表单应用程序和 Windows 服务(或任何 n 层,真的)之间保持设置同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167647/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com