C# 应用程序的多个实例,但仅运行一个
我有一个非托管应用程序,它在运行时打开我的托管应用程序。 -每次执行非托管应用程序时,它都会打开我的应用程序的一个新实例 我必须以某种方式实现这个场景: -第一次执行非托管应用程序时,我的托管应用程序应该可以正常运行,但如果用户尝试再次打开非托管应用程序,则这些托管实例应处于“待机”模式,如果当前运行的第一个托管应用程序关闭,则应关闭其中一个待机实例“恢复” 如我所见,我应该使用互斥:C# 应用程序的多个实例,但仅运行一个,c#,mutex,C#,Mutex,我有一个非托管应用程序,它在运行时打开我的托管应用程序。 -每次执行非托管应用程序时,它都会打开我的应用程序的一个新实例 我必须以某种方式实现这个场景: -第一次执行非托管应用程序时,我的托管应用程序应该可以正常运行,但如果用户尝试再次打开非托管应用程序,则这些托管实例应处于“待机”模式,如果当前运行的第一个托管应用程序关闭,则应关闭其中一个待机实例“恢复” 如我所见,我应该使用互斥: public Form1() { InitializeComponent();
public Form1()
{
InitializeComponent();
if (!IsSingleInstance())
{
this.Close();
return;
}
}
private static Mutex _mutex;
private static bool IsSingleInstance()
{
_mutex = new Mutex(false, "MyApp");
GC.KeepAlive(_mutex);
try
{
return _mutex.WaitOne(0, false);
}
catch (AbandonedMutexException)
{
_mutex.ReleaseMutex();
return _mutex.WaitOne(0, false);
}
}
protected override void OnClosing(CancelEventArgs e)
{
if (_mutex != null)
{
_mutex.ReleaseMutex();
}
}
但是当然,代码只检查另一个istance是否正在运行,如果正在运行,那么它将关闭它
我能做什么
谢谢,我宁愿把锁放在Program.cs的Main中
static void Main()
{
Mutex mutex = new Mutex(false, "MyApp");
if (mutex.WaitOne())
{
try
{
Application.Run(new Form1());
}
finally
{
mutex.ReleaseMutex();
}
}
}
“待机模式”在Windows中没有任何意义,它不提供“冻结”进程的方法。它应该被编程到代码中。你可以在进程拥有的所有线程上破解类似pinvoking SuspendThread的东西,但这相当麻烦。最好重新思考一下你在这里试图实现的目标。