我有一个c#/ WPF应用程序,该应用程序在某些客户端站点上是通过RPD运行的,即该应用程序驻留在客户端服务器上,并且用户可以通过终端服务会话进行访问。
我遇到的问题是我无法防止意外打开应用程序的多个实例。当应用程序在计算机上本地运行时,我可以使用以下命令阻止多个实例:
var processName = Process.GetCurrentProcess().ProcessName;
if (Process.GetProcesses().Count(p => p.ProcessName.Equals(processName)) > 1)
{
this.Log.LogInfo(this.GetType(), "Process already running. Shutting down.");
Application.Current.Shutdown();
Process.GetCurrentProcess().Kill();
}
但是,在RPP上这将不起作用,因为应用程序的其他实例可能在不同的RDP会话上运行。
有人知道如何禁用在同一RDP会话中运行的第二个应用程序实例吗?
答案 0 :(得分:1)
过去,我是使用Mutex完成此操作的。创建互斥锁时,可以使用命名约定 Global \\ MutexName 处理终端服务方案。
// declare in your program
private static Mutex mutex = null;
bool createdNew;
mutex = new Mutex(true, "Global\\MutexName", out createdNew);
if (!createdNew)
{
// Application is already running, so shutdown
Application.Current.Shutdown();
}
答案 1 :(得分:0)
我想每个远程连接都来自另一个用户。您可以使用以下内容确定谁是进程的所有者:How do I determine the owner of a process in C#?