使用Process类避免在一台机器上运行同一程序的多个实例
时间:2011-04-03 来源:辛勤的代码工
System.Diagnostics.Process类的实例可以引用一个进程,被引用的进程包含以下几种:
- 该实例的当前进程。
- 本机上除了当前进程的其他进程。
- 远程机器上的某个进程。
创建或销毁子进程
示例代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;
namespace ProcessTest
{
class Program
{
static void Main(string[] args)
{
//创建一个记事本子进程,且为记事本添加启动参数hello.txt
Process process = Process.Start("notepad.exe", "hello.txt");
//休眠2秒
Thread.Sleep(2000);
//终止刚刚创建的进程
process.Kill();
}
}
}
上例中使用Process类创建一个记事本子进程,休眠2秒后又将进程销毁。
避免在一台机器上运行同一应用程序的多个实例
我们可以使用Process类避免在一台机器上运行同一应用程序的多个实例。示例代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;
namespace ProcessTest
{
class Program
{
static void Main(string[] args)
{
if (TestIfAlreadyRunning())
{
System.Console.WriteLine("该程序已经运行了,不能再次运行!");
}
else
{
System.Console.WriteLine("当前只有一个该程序的实例!");
}
System.Console.ReadKey();
}
static bool TestIfAlreadyRunning()
{
//获取当前运行的进程引用
Process processCurrent = Process.GetCurrentProcess();
//获取当前机器上运行的同名进程实例
Process[] processes = Process.GetProcessesByName(processCurrent.ProcessName);
//当前机器存在同名进程再进行比较
if (processes.Length > 1)
{
foreach (Process process in processes)
{
//遍历同名进程,
//如果同名进程非当前进程且进程模块的完整路径与当前进程相同时,
//则说明当前机器中存在多个相同实例
if (process != processCurrent && process.MainModule.FileName == processCurrent.MainModule.FileName)
{
return true;
}
}
}
return false;
}
}
}
上例中通过Process类获取当前机器上的同名进程,并对同名进程模块的完整路径进行比较,从而得知本程序是否已被启动。
终止进程
可调用System.Environmetn类中的静态方法Exit(int exitcode)或FailFast(string message)终止当前进程。
Exit方法是最好的选择,它将彻底终止进程并向操作系统返回指定的退出代码值(exitcode)。之所以称为彻底终止,是因为Exit方法会执行当前进程中所有对象的清理工作(即执行对象的Finalize方法)和finally块中的代码。当然,终止进程将花费一定时间。
FailFast方法可快速终止进程,但它不会执行Exit方法中的清理工作。
相关阅读 更多 +