解决问题
关键字
C# 跨进程 临界区 互斥 进程锁
// 使用示例
namespace Test
{
using System;
class TestClass
{
static void Main(string[] args)
{
TestObjDemo();
}
// 使用示例。
[Conditional("DEBUG")]
public static void TestObjDemo()
{
using (new ProcessLocker("TestLocker"))
{
// 跨进程的临界区。
}
}
// 使用示例。
[Conditional("DEBUG")]
public static void TestDemo()
{
string name = "locker";
EventWaitHandle waitHandle = null;
bool isWaitOne = false;
try
{
// 开始进入跨进程临界区。
waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset, name);
isWaitOne = waitHandle.WaitOne();
// 成功进入跨进程临界区。
// 跨进程的临界区。
}
finally
{
// 开始退出跨进程临界区。
if (waitHandle != null)
{
if (isWaitOne)
{
waitHandle.Set();
}
waitHandle.Close();
}
// 成功退出跨进程临界区。
}
}
}
}
namespace System
{
/// <summary>
/// 跨进程的临界区。
/// </summary>
public class ProcessLocker : IDisposable
{
readonly string name;
readonly EventWaitHandle waitHandle;
public ProcessLocker(string name)
{
try
{
this.name = name;
// 开始进入跨进程临界区。
this.waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset, name);
this.IsWaitOne = this.waitHandle.WaitOne();
// 成功进入跨进程临界区。
}
catch (Exception ex)
{
Trace.WriteLine($"Process locker init {name} exception: " + ex);
}
}
public bool IsDisposed { get; private set; }
public bool IsWaitOne { get; private set; }
public void Dispose()
{
if (!IsDisposed)
{
IsDisposed = true;
var waitHandle = this.waitHandle;
if (waitHandle != null)
{
try
{
// 开始退出跨进程临界区。
if (IsWaitOne)
{
waitHandle.Set();
}
waitHandle.Close();
// 成功退出跨进程临界区。
}
catch (Exception ex)
{
Trace.WriteLine($"Process locker dispose {name} exception: " + ex);
}
}
}
}
}
}