现在的位置: 首页 > 综合 > 正文

使用Process类避免在一台机器上运行同一程序的多个实例

2012年08月15日 ⁄ 综合 ⁄ 共 1597字 ⁄ 字号 评论关闭

  System.Diagnostics.Process类的实例可以引用一个进程,被引用的进程包含以下几种:

  1. 该实例的当前进程。
  2. 本机上除了当前进程的其他进程。
  3. 远程机器上的某个进程。

创建或销毁子进程

  示例代码:

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方法中的清理工作。

抱歉!评论已关闭.