Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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应用程序关闭自身的第一个实例_C#_.net - Fatal编程技术网

C# C应用程序关闭自身的第一个实例

C# C应用程序关闭自身的第一个实例,c#,.net,C#,.net,我知道如何确保一次只运行一个应用程序实例: 但是。。。我如何确保在启动第二个实例时,第一个实例将关闭,而不是通常退出第二个实例。最好是等待它完全关闭 如果同时启动两个以上的实例,则只允许最后一个实例“活动” 我知道了,谢谢你的回答。我的解决方案如下: #region Kill other running processes of this application List<Process> processes = Process.GetProcess

我知道如何确保一次只运行一个应用程序实例:

但是。。。我如何确保在启动第二个实例时,第一个实例将关闭,而不是通常退出第二个实例。最好是等待它完全关闭

如果同时启动两个以上的实例,则只允许最后一个实例“活动”

我知道了,谢谢你的回答。我的解决方案如下:

        #region Kill other running processes of this application
        List<Process> processes = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).ToList();
        if (processes.Count > 1)
        {
            processes.Sort((x, y) => DateTime.Compare(x.StartTime, y.StartTime));
            for (int i = 0; i < processes.Count - 1; i++)
            {
                processes[i].CloseMainWindow();
                processes[i].WaitForExit();
            }
        }
        #endregion

        Console.WriteLine(string.Format("{0}:{1}", DateTime.Now.Minute, DateTime.Now.Second));
        Console.ReadLine();

也许有一种更好的方法可以做到这一点,它涉及到进程和事件之间的其他交互通信,但这里有一种基本方法,至少我不需要研究

当一个进程启动时,制作一个文件,可能带有一个时间戳来表示它是否启动


让原始进程定期检查该文件,如果它看到较新的时间戳,则停止该文件。

可能有一种更好的方法,涉及进程和事件之间的其他交互通信,但这里有一种基本方法,至少我不需要研究

当一个进程启动时,制作一个文件,可能带有一个时间戳来表示它是否启动

让原始进程定期检查该文件,如果发现较新的时间戳,则停止该文件。

您可以使用Microsoft.VisualBasic.dll类

事件在创建另一个实例时在第一个应用程序中引发。在这种情况下,您可以终止当前进程

 Process.GetCurrentProcess().Kill();
这将确保新实例处于活动状态,并关闭以前的实例。

您可以使用Microsoft.VisualBasic.dll的类

事件在创建另一个实例时在第一个应用程序中引发。在这种情况下,您可以终止当前进程

 Process.GetCurrentProcess().Kill();

这将确保新实例处于活动状态,而以前的实例已关闭。

我认为您自己对逻辑有点困惑。顺便说一下,这里有一些你应该用来做这件事的项目:

1-

通过为特定流程实例调用此方法,可以在调用Kill或Shutdown方法后等待流程完全退出。如果它是windows应用程序,则会在此过程中关闭主窗口。对于具有一些退出确认框的应用程序,它将等待用户确认或取消对话框,就像您的应用程序已打开时windows正在关闭一样

2-

如果要访问发送给进程的exist消息的结果,应在调用WaitForExit函数后调用此属性的值。我想您可以使用这个属性来确定第一个进程是否退出,以及第二个进程退出的原因

3-公共静态int Main

因为您需要从进程外部访问退出代码,所以应该将Main方法的返回值更改为int。这样,您可以在第一个进程中返回一个值,并通过ExitCode属性在第二个进程中访问它。如果在您的情况下很难在Main函数中返回值,您可以通过调用第4项来传递退出代码

4-System.Windows.Application.Shutdown退出.NET<4

调用此方法与在主函数中返回值完全一样

5-

毕竟,通过调用这个静态方法,您可以按指定的名称获取所有进程

希望能有帮助。我只是尽量简单地解释一切。这些都是可以用来实现逻辑的工具。如果你知道.NET为你提供的这些能力,剩下的就很简单了

毕竟,正如我已经忘记说的,如果你对做正确的事情感兴趣,在我看来,正如我的经验所说,有一种技术就是为这种逻辑而制造的

6-.NET进程间通信或IPC

IPC是基于.NET远程处理的。在我个人看来,这是.NET中最有趣的讨论,但不管名字怎么说,它不仅用于远程通信。远程处理有许多部分,其中一部分是进程间通信。这很难,但如果你问我,这是最好的办法


干杯

我想你自己对逻辑有点困惑。顺便说一下,这里有一些你应该用来做这件事的项目:

1-

通过为特定流程实例调用此方法,可以在调用Kill或Shutdown方法后等待流程完全退出。如果它是windows应用程序,则会在此过程中关闭主窗口。对于具有一些退出确认框的应用程序,它将等待用户确认或取消对话框,就像您的应用程序已打开时windows正在关闭一样

2-

如果要访问发送给进程的exist消息的结果,应在调用WaitForExit函数后调用此属性的值。我想你可以利用这个属性来发现我 f第一个进程是否退出,第二个进程退出的原因是什么

3-公共静态int Main

因为您需要从进程外部访问退出代码,所以应该将Main方法的返回值更改为int。这样,您可以在第一个进程中返回一个值,并通过ExitCode属性在第二个进程中访问它。如果在您的情况下很难在Main函数中返回值,您可以通过调用第4项来传递退出代码

4-System.Windows.Application.Shutdown退出.NET<4

调用此方法与在主函数中返回值完全一样

5-

毕竟,通过调用这个静态方法,您可以按指定的名称获取所有进程

希望能有帮助。我只是尽量简单地解释一切。这些都是可以用来实现逻辑的工具。如果你知道.NET为你提供的这些能力,剩下的就很简单了

毕竟,正如我已经忘记说的,如果你对做正确的事情感兴趣,在我看来,正如我的经验所说,有一种技术就是为这种逻辑而制造的

6-.NET进程间通信或IPC

IPC是基于.NET远程处理的。在我个人看来,这是.NET中最有趣的讨论,但不管名字怎么说,它不仅用于远程通信。远程处理有许多部分,其中一部分是进程间通信。这很难,但如果你问我,这是最好的办法



干杯

找到另一个实例进程id并可能杀死它?这并不是一个真正的答案,但我不会做你想做的事情。例如,如果第一个实例中有未保存的内容,而您打开了第二个实例,则在关闭它时可能会丢失数据。在处理Singleton时,当有一个打开的实例时,首选的做法是避免另一个实例,而不是在第二个实例启动时按名称关闭实例1和打开实例2Get进程,并杀死所有使用该名称的进程为什么是最后一个?这难道不意味着你可能会丢失数据吗?为什么不聚焦/激活原稿?您在这里的回答可能会告诉我们答案。为什么不让一个容器来实例化您想要的对象,并记住它创建的所有对象,并且每当创建一个新项目时,它都会终止旧对象。。。并验证他们自己清理后…找到另一个实例进程id并杀死它?这不是一个真正的答案,但我不会做你想做的事情。例如,如果第一个实例中有未保存的内容,而您打开了第二个实例,则在关闭它时可能会丢失数据。在处理Singleton时,当有一个打开的实例时,首选的做法是避免另一个实例,而不是在第二个实例启动时按名称关闭实例1和打开实例2Get进程,并杀死所有使用该名称的进程为什么是最后一个?这难道不意味着你可能会丢失数据吗?为什么不聚焦/激活原稿?您在这里的回答可能会告诉我们答案。为什么不让一个容器来实例化您想要的对象,并记住它创建的所有对象,并且每当创建一个新项目时,它都会终止旧对象。。。并验证它们在自己清理后…答案标记为C。这里的visual basic参考是什么?我们都知道,这些项目已经通过互联网或您提到的图书馆实施。但这里的问题是关于逻辑的实现,而不是使用它。然而,你的答案似乎不符合逻辑。谁投了-1票?阐明你的理由@Mohammad Goundarzi->Microsoft.VisualBasic.dll表示该库是由Visual Basic团队提供的,并没有说它仅在VB中可用。它也是C语言中广泛使用的.NET库,并使用远程处理作为进程之间的底层进程间通信。@Mohammad Goundarzi->对我来说,这个问题似乎只保留了最后一个实例,并关闭了前一个实例。和我说的完全一样。不多不少。你怎么能认为答案不够充分呢?你试过了吗,还是有什么不清楚的地方?这当然是来自互联网,但MSFT团队以及我的项目都进行了尝试和测试。答案很简单,提问者没有要求任何已实现的解决方案库。然而,正如我已经提到的,作为一个哑巴,你还不够清楚!,那么,你的答案怎么可能对那些不太了解情况并寻求帮助的人来说足够呢?顺便说一句,如果我投票否决你是错误的,不要担心,因为看到你答案的其他人会自动投票支持你。干杯VB库和Visual Basic团队提供的库之间存在差异。该库是.NET库,而不是visual basic库在VB6/VBA上不起作用答案标记为C。什么是visual basic参考

你在这儿吗?我们都知道,这些项目已经通过互联网或您提到的图书馆实施。但这里的问题是关于逻辑的实现,而不是使用它。然而,你的答案似乎不符合逻辑。谁投了-1票?阐明你的理由@Mohammad Goundarzi->Microsoft.VisualBasic.dll表示该库是由Visual Basic团队提供的,并没有说它仅在VB中可用。它也是C语言中广泛使用的.NET库,并使用远程处理作为进程之间的底层进程间通信。@Mohammad Goundarzi->对我来说,这个问题似乎只保留了最后一个实例,并关闭了前一个实例。和我说的完全一样。不多不少。你怎么能认为答案不够充分呢?你试过了吗,还是有什么不清楚的地方?这当然是来自互联网,但MSFT团队以及我的项目都进行了尝试和测试。答案很简单,提问者没有要求任何已实现的解决方案库。然而,正如我已经提到的,作为一个哑巴,你还不够清楚!,那么,你的答案怎么可能对那些不太了解情况并寻求帮助的人来说足够呢?顺便说一句,如果我投票否决你是错误的,不要担心,因为看到你答案的其他人会自动投票支持你。干杯VB库和Visual Basic团队提供的库之间存在差异。该库是.NET库,而不是visual basic库在VB6/VBAIn上无法工作进程消息传递是一件好事。我自己也试了很多次。进程内消息传递是一件好事。我自己也试了很多次。谢谢。这真的帮了我大忙。只有一个问题。在我的解决方案中,for循环中有进程。Count-1。但出于某种原因,它并没有扼杀当前的进程,这是好的。但我不明白为什么。这不应该是进程吗?计数-2?很高兴听到它很有用。通过使用processs.Count-1或简单地说someArray.Count-1,您指的是数组的最后一项,并且必须确保数组中至少存储了一项。简单地说-2是指最后一项之前的一项,它会导致您检查一些其他约束以防止引发未处理的异常。尽可能简单地分析现实世界中的一切。希望能有帮助。干杯。对不起,这是当然的,因为我用了接线员。一个额外的-1将跳过总共2个。这就是为什么。我看不到代码,但你提到的完全正确@拿破仑我可以请你帮个忙吗?请看一下Tilak的答案,看看是否有用,投票支持他。我确实投票否决了答案,因为我有我的理由,我想他对此很生气。谢谢你的身体;谢谢这真的帮了我大忙。只有一个问题。在我的解决方案中,for循环中有进程。Count-1。但出于某种原因,它并没有扼杀当前的进程,这是好的。但我不明白为什么。这不应该是进程吗?计数-2?很高兴听到它很有用。通过使用processs.Count-1或简单地说someArray.Count-1,您指的是数组的最后一项,并且必须确保数组中至少存储了一项。简单地说-2是指最后一项之前的一项,它会导致您检查一些其他约束以防止引发未处理的异常。尽可能简单地分析现实世界中的一切。希望能有帮助。干杯。对不起,这是当然的,因为我用了接线员。一个额外的-1将跳过总共2个。这就是为什么。我看不到代码,但你提到的完全正确@拿破仑我可以请你帮个忙吗?请看一下Tilak的答案,看看是否有用,投票支持他。我确实投票否决了答案,因为我有我的理由,我想他对此很生气。谢谢你的身体;