【问题标题】:How do I make sure a program is only running once across all sessions on a windows server 2012?如何确保程序在 windows server 2012 上的所有会话中只运行一次?
【发布时间】:2016-11-25 13:48:13
【问题描述】:

我用 C# 制作了一个系统托盘应用程序,它只是在后台运行。它使用 Exchange WebServices 侦听邮件服务器,并在邮件帐户每次收到邮件时执行一组操作。它正在使用许多 Excel 应用程序,如果我将程序转换为服务,则无法正常工作(这就是为什么它必须是系统试用应用程序的原因)。

程序不能一次运行多次,这一点很重要。我添加了一个互斥锁,所以我不能在同一个会话中多次运行该程序。但是问题是,当我登录到 Windows Server 上的另一个会话(每个用户可以有两个会话)时,该程序在系统托盘中不可见,我可以再次打开它,因此它运行两次,每次运行一次会议。如何防止这种情况发生?

谢谢

【问题讨论】:

  • 创建一个具有保留名称的文件,例如C:\temp 并保持锁定状态,以便实例 #2 注意到并退出?
  • 互斥体的名称是什么?如果互斥锁名称以 Global\ 开头,则它对所有终端服务会话都是全局的。您还应该检查互斥锁权限,以便所有用户都可以访问它。
  • 为什么不能支持每个用户会话的单个托盘应用程序?不同的用户会话应该有自己的托盘应用程序。

标签: c# session windows-server-2012 system-tray


【解决方案1】:

您应该会看到这样的所有进程:

using System.Diagnostics;
var allProcceses = Process.GetProcesses();

然后你可以检查你的程序是否正在运行。

【讨论】:

  • 但是当我运行程序时,总会有一个同名的进程。如果我的程序名为 mailChecker,并且在该程序中我检查 mailChecker 是否打开,它将始终返回 true,因为 mailChecker 会检查 mailChecker 是否打开。还是我错了?
  • 您可以使用 GetProcessesByName 并查找 mailChecker。如果有 on 已经在运行,您将看到两个条目,此时您的程序可以自行停止。
  • 抱歉回复晚了。要么按照@Mant101 所说的去做,然后检查进程的数量。或者使用“Process.GetCurrentProcess()”获取当前进程并比较 Id,如果它们相同,则您正在查看当前程序进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多