Mutex构造函数,第一个参数是获取所有权,第二个参数是互斥变量名,第三个是新创建true,还是已存在false。 需要注意的是Mutex对象即使不是新创建的,也需要进行释放,否则下一次获取都是返回已存在
ToolMutex.Exist判断互斥是否已存在,不会创建互斥对象,适用于检查某种操作是否完成
IsFirst 判断是否第一次运行,并且创建互斥对象,如果再次调用时,会返回false; Close 关闭当前互斥对象 。在进程的不同线程中可以多次IsFirst与Close
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Text;
namespace LibCSharpSyntax.操作系统
{
public class ToolMutex
{
System.Threading.Mutex mutex = null;
///<summary>
///判断程序是否正在运行
///</summary>
///<param name="appId">程序名称</param>
///<returns>如果程序是第一次运行返回True,否则返回False</returns>
public bool IsFirst(string appId)
{
bool bExist = false;
mutex = new System.Threading.Mutex(true, appId, out bExist);
if (bExist && mutex.WaitOne(1))
{
return true;
}
else
{
Relase();
return false;
}
#region openmutex
//if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
//{
// CreateMutex(IntPtr.Zero, 0, appId);
// ret = true;
//}
//return ret;
#endregion
}
public static bool Exist(string appId)
{
bool bExist = false;
var localmutex = new System.Threading.Mutex(false, appId, out bExist);
localmutex.Close();
localmutex.Dispose();
localmutex = null;
return !bExist;
}
private void Relase()
{
if (mutex != null)
{
mutex.Close();
mutex.Dispose();
mutex = null;
}
}
/// <summary>
/// 释放占用
/// </summary>
public void Close()
{
if (mutex != null)
{
mutex.ReleaseMutex();
Relase();
}
#region OpenMutex
//var handle= OpenMutex(0x1F0001, 0, appId);
//if ( handle!= IntPtr.Zero)
//{
// ReleaseMutex(handle);
//}
#endregion
}
#region WINDOWS API
//[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
//private static extern IntPtr OpenMutex(
// uint dwDesiredAccess, // access
// int bInheritHandle, // inheritance option
// string lpName // object name
// );
//[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
//private static extern IntPtr CreateMutex(
// IntPtr lpMutexAttributes, // SD
// int bInitialOwner, // initial owner
// string lpName // object name
// );
//[DllImport("kernel32.Dll", EntryPoint = "ReleaseMutex", SetLastError = true)]
//private static extern int ReleaseMutex(IntPtr hMutex);
#endregion
}
}