Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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#_Mutex - Fatal编程技术网

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的东西,但这相当麻烦。最好重新思考一下你在这里试图实现的目标。