防止多个实例在不同的计算机上同时运行

时间:2013-12-10 06:53:24

标签: c#

如何防止多个实例在不同的机器上同时运行。我想检查其他用户是否实时在同一个实例上工作,而不是等到X时间。

  • 我正在使用c#代码。
  • 实例连接到同一个数据库。

4 个答案:

答案 0 :(得分:0)

当您运行应用程序时,首先检查是否有其他计算机正在运行此应用程序,如果没有,请插入一些标识符,这意味着当前计算机XX正在运行您的应用程序。当您关闭应用程序时,请更新您的数据库(或删除您的标识符),以便让其他计算机使用您的应用程序。

如果您想提高可靠性,可以每隔XX个时间单位向数据库发送一些信号,以确认您的机器仍在使用您的应用程序,如果在XX时间单位后没有信号到达,请让其他机器使用该选项你的应用程序这种方法可以让其他用户在某些机器关闭时使用您的应用程序而不报告它(例如,连接问题)。

你可以做得更复杂,并在每次交易或每个XX时间单位检查你的机器仍有资格使用你的应用程序。

希望这有帮助

答案 1 :(得分:0)

有很多方法可以做到这一点:

  1. 如果存在同名的进程无法启动您的应用程序,请检查您的应用程序必须运行进程的Windows进程。
  2. 其次,如果用户已使用相同的用户名和密码登录并再次使用该用户名登录并通过拒绝,则维护已登录的用户详细信息。
  3. 此外,您可以在登录时获取计算机名称并保存登录用户的计算机名称,如果用户来自同一名称,则会再次拒绝该计算机名称。

答案 2 :(得分:0)

在数据库中创建锁定表:

Locks
  LockId (primary key; not auto increment)
  MachineId (this is a machine identifier; can be ip if in same network, MAC or a guid/string you set in your application's config file)
  LockExpires (DateTime)

使用一个记录为您的Locks表种子。示例值:LockId = 1(可以是任何内容),MachineId = null,LockExpires = null。

在您的程序中硬编码/配置种子LockId,以便在查询中使用它。

您将使用三个查询来设置/检查/删除锁定:

-- SetLock
update Locks set
  MachineId = {MachineId you configured for the machine},
  LockExpires = adddate(minutes, {N}, getdate()) -- lock for N minutes; set to null to hold the lock indefinitely)
where 
  LockId = {hardcoded LockId} and
  (
  MachineId is null -- nobody holds a lock
  or LockExpires <= getdate() -- or lock expired
  or MachineId = {MachineId you configured for the machine} -- or you hold the lock
  )

-- CheckLock (if count > 0 then you hold the lock)
select count(*) from Locks 
where
  LockId = {hardcoded LockId} and
  MachineId = {MachineId you configured for the machine} and 
  LockExpires > getdate()

-- DeleteLock
update Locks set
  MachineId = null
where 
  LockId = {hardcoded LockId} and
  MachineId = {MachineId you configured for the machine} and 
  LockExpires > getdate()

当程序启动时,检查是否在同一台机器上运行实例(类似“How to determine if a previous instance of my application is running?”)。

如果您是此计算机上的唯一实例,则为SetLockCheckLock。如果CheckLock说您没有锁定,那么请继续操作。

在您的应用程序中编写代码(最好在单独的线程中)以设置/检查每隔(N - M)分钟的锁定。其中N是持有锁的分钟数,M是一个小数字(1或2),以确保您的锁不会意外到期。

退出应用程序时,DeleteLock

请记住,如果您的应用程序崩溃,则在锁定到期之前不能运行任何其他实例。在最坏的情况下,没有应用程序可以运行N分钟(好吧,在 最坏的情况下,您将LockExpires设置为null,并且在您手动更改{{ 1}}为null)。

同样,如果您没有频繁地重置锁定,那么您的锁定可能会在重置之前到期,而另一个应用程序可以在该时间范围内运行。

因此根据您的偏好和编码能力设置数字而不会出现错误:-)。如果您可以在没有应用程序运行几分钟的情况下生活,N = 4到10和M = 1到2应该可以工作。

答案 3 :(得分:-1)

如果您使用的是“Sql Server”,则可以将数据库设置为“单用户模式

一旦进入此模式,只允许当前连接查询或修改数据库的数据或模式。如果任何其他用户或进程尝试建立与数据库的连接,则会收到错误。

将数据库设置为单用户模式的最简单方法是使用以下命令:

ALTER DATABASE database-name SET SINGLE_USER

在所有事情之前,您的程序应该检查它是否能够连接数据库,如果建立连接,程序可以在这种情况下正常运行。