在Program.cs中我做了:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Diagnostics;
using DannyGeneral;
namespace mws
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
if (IsApplicationAlreadyRunning() == true)
{
MessageBox.Show("The application is already running");
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
catch (Exception err)
{
Logger.Write("error " + err.ToString());
}
}
static bool IsApplicationAlreadyRunning()
{
string proc = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(proc);
if (processes.Length > 1)
{
return true;
}
else
{
return false;
}
}
}
}
我使用了一个断点,即使我从visual studio关闭了我的程序,我再次尝试运行它,它返回true并抛出应用程序已经运行的消息。
在断点中,我看到变量proc包含:My Weather Station.vshost
现在我注意到只有当我在新的Visual Studio窗口中打开我的应用程序的另一个副本并且应用程序在另一个硬盘上的另一个位置并且我没有在任何视觉工作室上运行该应用程序时才会发生这种情况窗户。
那么为什么当我在visual studio中打开两次相同的应用程序并且它没有运行时,它认为它正在运行? 即使我关闭第二个视觉工作室,我仍然在proc My Weather Station.vshost中看到,但这次它返回false。
修改
我现在看到变量进程在索引0和1 My Weather Station.vshost中包含两次 如果我关闭第二个视觉工作室,它只包含一个。
问题是这个My Weather Station.vshost是什么?如果应用程序没有运行,为什么它被视为正在运行的应用程序?如何更好地进行此检查,如果我打开更多应用程序副本,它会认为应用程序没有运行?
我想打开我的应用程序的另一个副本的原因是第二个更旧,我想看到我做的一些旧事。
我可以改变这个:
if (processes.Length > 1)
并使其成为&gt;例如10 但我还是不明白什么是My Weather Station.vshost?为什么它在内存中运行?为什么它将其视为正在运行的应用程序?
答案 0 :(得分:1)
您似乎正在尝试创建一个&#34;单实例应用程序&#34;。为此发布了几种现有解决方案。普遍接受的方法是使用互斥锁并查看它是否已被保留,如下所示: What is the correct way to create a single-instance application?
此外,它似乎已经内置到Windows窗体中的功能(基于您的示例源文件中的引用,您似乎使用)。请参阅Prevent application launch if already running