怎么让C#程序同时只能运行一个实例
2个回答
展开全部
两种方法。
一是在主窗体 Load 时检测当前进程,如果存在两个或两个以上当前实例的进程,则结束自身。这种方法好处是可以自定义个提示什么的,比如弹出个警告“程序已经运行”之类的;缺点时每次运行前都会遍历一遍进程,比较卡。
二修改 Program.cs,引用 Microsoft.VisualBasic 并引入命名空间 Microsoft.VisualBasic.ApplicationServices,使 Program 类继承 WindowsFormsApplicationBase。
在 Program 的构造函数类加一句:this.IsSingleInstance = true; 就是单实例化模式了。这种办法不能自定义提示,且是在主窗体载入前就已经完成检测的,检测到有两个实例的进程系统会自动结束后启动的。
【补充】yezhiwe5633 的回答用了互斥锁,优点很明显,比较简单;缺点也同样明显,因为互斥锁是全局的,所以如果同一台电脑上有多个帐户,那么只要有一个账号运行了就会导致其他用户无法运行;另一个缺点是 .NET 不会自己回收 Mutex,如果程序被非法终止(比如遇到错误抛出了,或者被进程杀死了),那么上一个 Mutex 没被释放,新启动的程序将始终处于死锁状态。
一是在主窗体 Load 时检测当前进程,如果存在两个或两个以上当前实例的进程,则结束自身。这种方法好处是可以自定义个提示什么的,比如弹出个警告“程序已经运行”之类的;缺点时每次运行前都会遍历一遍进程,比较卡。
二修改 Program.cs,引用 Microsoft.VisualBasic 并引入命名空间 Microsoft.VisualBasic.ApplicationServices,使 Program 类继承 WindowsFormsApplicationBase。
在 Program 的构造函数类加一句:this.IsSingleInstance = true; 就是单实例化模式了。这种办法不能自定义提示,且是在主窗体载入前就已经完成检测的,检测到有两个实例的进程系统会自动结束后启动的。
【补充】yezhiwe5633 的回答用了互斥锁,优点很明显,比较简单;缺点也同样明显,因为互斥锁是全局的,所以如果同一台电脑上有多个帐户,那么只要有一个账号运行了就会导致其他用户无法运行;另一个缺点是 .NET 不会自己回收 Mutex,如果程序被非法终止(比如遇到错误抛出了,或者被进程杀死了),那么上一个 Mutex 没被释放,新启动的程序将始终处于死锁状态。
展开全部
很久不答了,我来回答下
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
bool isRun;
using (Mutex mu = new Mutex(true, "Global\\myapp", out isRun))
{
if (isRun)
{
Application.Run(new Form1());
}
}
}
Global\\myapp 中的 myapp可以是随意的符号,用来识别本程序。
这个单实例的效果是,不管你的电脑用什么账号登录,只允许一个程序实例。比如在服务器上。多个人同时登录到一台服务器上。那么只要有一个用户运行了这个程序,其他用户就不能再运行这个程序。比较适用于自动启动类的程序。
针对那位老兄说的,对其中有不同看法的补充一下。
互斥是全局的,这个怎么理解?如果只是在当前用户账户下单程序实例.只要将Global改成 Local就可以了。这个时候一台电脑上多个账户就可以同时启动这个应用程序了。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
bool isRun;
using (Mutex mu = new Mutex(true, "Global\\myapp", out isRun))
{
if (isRun)
{
Application.Run(new Form1());
}
}
}
Global\\myapp 中的 myapp可以是随意的符号,用来识别本程序。
这个单实例的效果是,不管你的电脑用什么账号登录,只允许一个程序实例。比如在服务器上。多个人同时登录到一台服务器上。那么只要有一个用户运行了这个程序,其他用户就不能再运行这个程序。比较适用于自动启动类的程序。
针对那位老兄说的,对其中有不同看法的补充一下。
互斥是全局的,这个怎么理解?如果只是在当前用户账户下单程序实例.只要将Global改成 Local就可以了。这个时候一台电脑上多个账户就可以同时启动这个应用程序了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询