首页 > Linux操作系统 > Linux操作系统 > C#实现确保单进程类
/*------------------------------------------
* 模块名称:确保单进程类
* 设计作者:张鹏
* 设计日期:2009-6-4
* 备注:大风扇吹空香皂盒
*------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Net;
namespace aaaSoft
{
///
/// 单进程类
///
class SingleProcess
{
private string GuidString;
private int TcpPort;
private TcpListener listener;
///
/// 构造函数
///
/// 唯一标识符
/// 监听TCP端口号
public SingleProcess(string GuidString, int TcpPort)
{
this.GuidString = GuidString;
this.TcpPort = TcpPort;
}
///
/// 当第二进程运行时引发
///
public event EventHandler SecondProcessStart;
///
/// 开始确保单进程
///
public void Start()
{
try
{
listener = new TcpListener(IPAddress.Parse("127.0.0.1"), TcpPort);
listener.Start();
Thread trdListen = new Thread(Run);
trdListen.Start();
}
catch
{
//说明已经有实例存在
TcpClient client = new TcpClient();
client.Connect("127.0.0.1", TcpPort);
NetworkStream ns = client.GetStream();
byte[] buffer = Encoding.Default.GetBytes(GuidString);
ns.Write(buffer, 0, buffer.Length);
ns.Close();
Environment.Exit(0);
}
}
///
/// 结束确保单进程
///
public void Stop()
{
listener.Stop();
}
private void Run()
{
try
{
while (true)
{
TcpClient client = listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
StreamReader sr = new StreamReader(ns);
string s = sr.ReadToEnd();
ns.Close();
if (s.Equals(GuidString))
{
//触发事件
SecondProcessStart.Invoke(null, null);
}
}
}
catch { }
}
}
}==================================================================
下面是使用示例,仅需要修改Program.cs文件(Demo项目Program.cs文件如下):
==================================================================
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace 单实例运行
{
static class Program
{
const int TcpPort = 53256;
const string GuidString = "C0DA3908-7F39-45ad-8E5B-CC47064031EA";
public static aaaSoft.SingleProcess sp;
public static Form frmMain;
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
frmMain = new Form1();
sp = new aaaSoft.SingleProcess(GuidString, TcpPort);
sp.SecondProcessStart += new EventHandler(sp_SecondProcessStart);
sp.Start();
Application.Run(frmMain);
sp.Stop();
}
static void sp_SecondProcessStart(object sender, EventArgs e)
{
frmMain.WindowState = FormWindowState.Normal;
frmMain.Show();
frmMain.Activate();
}
}
}来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-610735/ ,如需转载,请注明出处,否则将追究法律责任。