Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止多个实例在不同的计算机上同时运行_C# - Fatal编程技术网

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

C# 防止多个实例在不同的计算机上同时运行,c#,C#,如何防止多个实例在不同的机器上同时运行。我想检查其他用户是否在同一实例上实时工作,即不等待X时间 我用的是c代码。 实例连接到同一数据库。 运行应用程序时,首先检查是否没有其他计算机正在运行此应用程序,如果没有,请插入某个标识符,这表示当前计算机XX正在运行您的应用程序。当您关闭应用程序时,请更新您的数据库或删除您的标识符,以便让其他计算机使用您的应用程序 如果您想提高可靠性,您可以每XX时间单位向DB发送一些信号,以确认您的机器仍在使用您的应用程序,如果XX时间单位后没有信号到达,请让其他机器

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

我用的是c代码。 实例连接到同一数据库。
运行应用程序时,首先检查是否没有其他计算机正在运行此应用程序,如果没有,请插入某个标识符,这表示当前计算机XX正在运行您的应用程序。当您关闭应用程序时,请更新您的数据库或删除您的标识符,以便让其他计算机使用您的应用程序

如果您想提高可靠性,您可以每XX时间单位向DB发送一些信号,以确认您的机器仍在使用您的应用程序,如果XX时间单位后没有信号到达,请让其他机器选择使用您的应用程序。这种方法可以让其他用户在某些机器因某种原因关闭而未报告时使用您的应用程序,例如,连接问题

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


希望能有所帮助

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

检查windows进程如果存在同名的进程而不启动应用程序,则应用程序必须运行该进程。 其次,如果用户已经使用相同的用户名和密码登录,并再次使用该用户名登录并通过拒绝,请维护登录用户的详细信息。 此外,您还可以在登录时获取计算机名,并保存登录用户的计算机名,如果用户来自同一名称,请再次拒绝。
在数据库中创建锁表:

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()
当程序启动时,检查是否有一个实例在同一台机器上运行

如果您是此计算机上的唯一实例,请设置Lock和CheckLock。如果CheckLock说你没有持有锁,那么就离开,否则继续

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

退出应用程序时,删除锁

请记住,如果您的应用程序崩溃,则在锁过期之前不能运行其他实例。在最坏的情况下,没有应用程序能够运行N分钟。在最坏的情况下,您将LockExpires设置为null,并且在手动将MachineId更改为null之前,没有应用程序将运行

类似地,如果您没有足够频繁地重置锁,您的锁可能会在重置之前过期,而另一个应用程序可以在该时间段内运行


因此,根据您的偏好和无bug编码的能力设置数字:-。如果应用程序不运行几分钟,N=4到10和M=1到2应该可以工作。

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

在此模式下,仅允许当前连接查询或修改数据库的数据或模式。如果任何其他用户或进程尝试连接到数据库,则会收到错误

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

ALTER DATABASE database-name SET SINGLE_USER

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

数据库运行在哪个数据库系统上?您的第一个建议是错误的-他的应用程序在不同的机器上运行,因此检查进程是否运行不会起作用。第二个和第三个方法也是错误的-我有更多的用户名和密码来登录表单,并建议机器是否突然关闭没有登录。。。建议机器网络电缆是否断开。我知道这种方式,但它类似于web应用程序的会话方式。我想检查用户是否正在处理该实例,意思是我不需要锁定过期。如果您试图阻止同一用户从不同的计算机登录,请使用UserId替换MachineId。或者甚至同时使用这两种方法并相应地更改查询,这样您就可以告诉用户他/她已经登录了哪台机器。我的问题是如何锁定实例而不是锁定数据库,建议我使用更多在同一数据库上工作的实例: