在C#中使用Global Mutex的良好模式是什么?

Mutex类非常容易被误解,而全局互斥体更是如此。

创建全局互斥锁时,可以使用哪种良好,安全的模式?

一个会起作用的

  • 无论我的机器位于哪个区域
  • 保证正确释放互斥锁
  • 如果没有获取互斥,可以选择不永久挂起
  • 处理其他进程放弃互斥锁的情况

回答:

我想确保这是正确的,因为很难正确地做到这一点:

using System.Runtime.InteropServices;   //GuidAttribute

using System.Reflection; //Assembly

using System.Threading; //Mutex

using System.Security.AccessControl; //MutexAccessRule

using System.Security.Principal; //SecurityIdentifier

static void Main(string[] args)

{

// get application GUID as defined in AssemblyInfo.cs

string appGuid =

((GuidAttribute)Assembly.GetExecutingAssembly().

GetCustomAttributes(typeof(GuidAttribute), false).

GetValue(0)).Value.ToString();

// unique id for global mutex - Global prefix means it is global to the machine

string mutexId = string.Format( "Global\\{{{0}}}", appGuid );

// Need a place to store a return value in Mutex() constructor call

bool createdNew;

// edited by Jeremy Wiebe to add example of setting up security for multi-user usage

// edited by 'Marc' to work also on localized systems (don't use just "Everyone")

var allowEveryoneRule =

new MutexAccessRule( new SecurityIdentifier( WellKnownSidType.WorldSid

, null)

, MutexRights.FullControl

, AccessControlType.Allow

);

var securitySettings = new MutexSecurity();

securitySettings.AddAccessRule(allowEveryoneRule);

// edited by MasonGZhwiti to prevent race condition on security settings via VanNguyen

using (var mutex = new Mutex(false, mutexId, out createdNew, securitySettings))

{

// edited by acidzombie24

var hasHandle = false;

try

{

try

{

// note, you may want to time out here instead of waiting forever

// edited by acidzombie24

// mutex.WaitOne(Timeout.Infinite, false);

hasHandle = mutex.WaitOne(5000, false);

if (hasHandle == false)

throw new TimeoutException("Timeout waiting for exclusive access");

}

catch (AbandonedMutexException)

{

// Log the fact that the mutex was abandoned in another process,

// it will still get acquired

hasHandle = true;

}

// Perform your work here.

}

finally

{

// edited by acidzombie24, added if statement

if(hasHandle)

mutex.ReleaseMutex();

}

}

}

以上是 在C#中使用Global Mutex的良好模式是什么? 的全部内容, 来源链接: utcz.com/qa/416381.html

回到顶部