我有一个.NET应用程序,我只允许在一次运行单个进程,但该应用程序不时用于Citrix盒子,因此,可以由同一台机器上的多个用户运行
我想检查并确保应用程序每个用户会话只运行一次,因为如果用户A正在运行应用程序,那么用户B就会获得“已在使用的应用程序”消息,而不应该。 / p>
这就是我现在检查正在运行的过程:
Process[] p = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
if (p.Length > 1)
{
#if !DEBUG
allowedToOpen &= false;
errorMessage +=
string.Format("{0} is already running.{1}", Constants.AssemblyTitle, Environment.NewLine);
#endif
}
答案 0 :(得分:5)
编辑:根据this cw question ...
改进了答案您可以使用互斥锁检查应用程序是否已运行:
using( var mutex = new Mutex( false, AppGuid ) )
{
try
{
try
{
if( !mutex.WaitOne( 0, false ) )
{
MessageBox.Show( "Another instance is already running." );
return;
}
}
catch( AbandonedMutexException )
{
// Log the fact the mutex was abandoned in another process,
// it will still get aquired
}
Application.Run(new Form1());
}
finally
{
mutex.ReleaseMutex();
}
}
重要的是AppGuid
- 您可以依赖于用户。
也许您想阅读这篇文章:the misunderstood mutex
答案 1 :(得分:3)
正如tanascius所说,你可以使用互斥锁。
在运行终端服务的服务器上,命名系统互斥锁可以具有两个级别的可见性。如果其名称以前缀“Global \”开头,则互斥锁在所有终端服务器会话中都可见。如果其名称以前缀“Local \”开头,则互斥锁仅在创建它的终端服务器会话中可见。
答案 2 :(得分:0)
如果Form1启动非后台线程,并且Form1退出,则表示您遇到了问题:已释放互斥锁但该进程仍然存在。下面的内容是更好的恕我直言:
static class Program {
private static Mutex mutex;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
bool createdNew = true;
mutex = new Mutex(true, @"Global\Test", out createdNew);
if (createdNew) {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else {
MessageBox.Show(
"Application is already running",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
}
}
只要主应用程序域仍处于运行状态,就不会释放互斥锁。只要应用程序正在运行,这将会存在。
答案 3 :(得分:0)
只是陈述显而易见的内容 - 虽然replace
通常被认为是更好的解决方案,但您仍然可以在没有Mutex
的情况下解决每个会话的单个实例问题 - 只需测试Mutex
SessionId