我在c#中编写了一个程序 现在我想知道如果程序已经运行,阻止程序启动的正确方法是什么?
所以,如果它已经在运行,并且双击该程序,它将无法启动,因为它已经在运行。
我可以这样做,但我正在考虑一种标准和正确的方式。
答案 0 :(得分:10)
建议的方法是使用系统互斥锁。
bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
if (createdNew)
// first instance
Application.Run();
else
MessageBox.Show("There is already an instace running");
}
Mutex ctor的第一个参数告诉它为该线程创建一个系统范围的互斥锁。如果互斥锁已经存在,它将通过第3个参数返回false
。
<强>更新强>
把它放在哪里?
我把它放在program.cs中。如果将其放在form_load中,则需要在应用程序的生命周期内保留互斥锁(将互斥锁作为表单上的成员),然后以卸载形式手动释放它。
在其他应用程序打开数据库连接等之前以及为表单/控件等创建资源之前,您越早称之为越好。
答案 1 :(得分:4)
我在其中一个应用程序中执行的快速方法..您可以查看正在运行的进程列表,以查看当前应用程序是否已在运行,而不是再次启动应用程序。
Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
// The TestApplication is already running, don't run it again
}
答案 2 :(得分:2)
我认为列举进程列表可能会很慢。您还可以使用System.Threading.Mutex类创建一个Mutex,并检查它是否已在进程启动时创建。但是,这需要调用Win32系统代码,因此不会完全与平台无关。
答案 3 :(得分:2)
看看Scotts blog post,不要被程序集名称弄糊涂。它只是.Net框架中标准文件的文件名。
以下是有关WindowsFormsApplicationBase的MSDN的更多信息。
答案 4 :(得分:0)
您可以使用Semaphore和一个相当独特的名称来使用系统范围的Semaphore Constructor (Int32, Int32, String, Boolean%) constructor。
干杯,马蒂亚斯
答案 5 :(得分:0)
如果您的应用程序生成/使用文件,那么您最好注册系统范围的通信机制(例如远程处理或WCF端点,甚至是套接字)。然后,如果通过双击其中一个文件启动应用程序的第二个实例,则可以将文件信息发送到正在运行的实例。
否则,如果它是一个独立的程序,那么就像其他人所说的那样,Mutex或Semaphore服务器同样会很好。
答案 6 :(得分:0)
解决方案禁止再次运行应用程序(重新打开应用程序)。
1-首先添加Class RunAlready.cs
2-Call方法processIsRunning(),带有来自Program.cs中RunAlready.cs的Name Process
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Tirage.MainStand
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
string outApp = RunAPP.processIsRunning("Tirage.MainStand");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
if (outApp.Length == 0)
{
if (fLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new MainStand_masterFrm());
}
}
else MessageBox.Show( "Instance already running");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PublicClass.Class
{
public class RunAlready
{
public string processIsRunning(string process)
{
string xdescription = "";
System.Diagnostics.Process[] processes =
System.Diagnostics.Process.GetProcessesByName(process);
foreach (System.Diagnostics.Process proc in processes)
{
var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
{
xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
xdescription += "Virtual memory size : " + proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
}
}
return xdescription;
}
}
}