我发现这个链接提供了一些示例代码来修改应用程序范围的变量My.Settings
可能很有用。我已经用一个带有计时器和标签的简单表单对其进行了测试,该标签向我显示了AdminIn
设置的当前值,它似乎有效。My.Settings
计时器通过检查重新加载的值来更新表单的每个实例上的标签。该变量需要在应用程序范围内,以便任何可能运行可执行文件的机器上的所有用户都可以访问。
http://www.codeproject.com/Articles/19211/Changing-application-scoped-settings-at-run-time
这是我汇总的表单代码,以使当前管理员计数保持最新。非常简单,但它似乎巧妙地完成了这项工作。
Public Class Form1
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'Decrement the AdminIn count when the current instance of the form is closed.
Me.tmrAdminCheck.Stop()
ChangeMyAppScopedSetting((My.Settings.AdminIn - 1).ToString)
'Reload the .exe.config file to synchronize the current AdminIn count.
My.Settings.Reload()
My.Settings.Save()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Increment the current AdminIn count when a new instance of the form is loaded
ChangeMyAppScopedSetting((My.Settings.AdminIn + 1).ToString)
'Reload the .exe.config file to synchronize the current AdminIn count.
My.Settings.Reload()
My.Settings.Save()
Me.lblAdminsIn.Text = "Current Admins In: " & My.Settings.AdminIn.ToString
'Start the timer to periodically check the AdminIn count from My.Settings
Me.tmrAdminCheck.Enabled = True
Me.tmrAdminCheck.Interval = 100
Me.tmrAdminCheck.Start()
Me.Refresh()
Application.DoEvents()
End Sub
Private Sub tmrAdminCheck_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAdminCheck.Tick
'Reload the .exe.config file to synchronize the current AdminIn count.
My.Settings.Reload()
Me.lblAdminsIn.Text = "Current Admins In: " & My.Settings.AdminIn.ToString
Me.Refresh()
Application.DoEvents()
End Sub
End Class
我用这种方法发现了一些东西,它们与其他人在评论中已经提到的内容有关:
- 应用程序的 .exe.config 文件必须位于可访问的位置(CodeProject 示例默认为应用程序的可执行目录)。当然,您可以将设置保存到另一个共享目录中的 INI 文件或其他配置文件中并完成类似的事情,但这种方法使用
My.Settings
.
- 您可能需要做一些额外的检查,以检查两个人试图同时进入的可能性。如果发生这种情况,配置文件仍将打开并锁定,并且
AdminIn
不会保存新值。CodeProject 示例没有任何异常处理,但您可以通过对 Sub 进行递归调用轻松地将此功能用于异常处理。
否则,这似乎是完成您所说的完全可行的方法。