使用EventWaitHandle确保单个实例应用程序包含通知

时间:2014-05-12 04:05:53

标签: c# .net multithreading mutex event-wait-handle

在以下使用EventWaitHandle确保单个实例应用程序的示例中设置EventWaitHandleSecurity的正确方法是什么?

    /// <summary>
    /// The method either:
    /// 1) acquires mutex and starts listing if anyone tries to get the same mutex,
    /// or
    /// 2) notifies the instance that actually owns the mutex
    /// </summary>
    /// <param name="isSystemWide">
    /// true if mutex is system wide (can belong to any user of the system),
    /// false if there could be one mutex per active user
    /// </param>
    /// <param name="instanceName">The name of the mutex</param>
    /// <param name="callback">Callback to be raised after the mutex is acquired
    /// on every time another instance tries (and fails) to acquire the mutex</param>
    /// <returns>
    /// true if mutex is acquired (and event is subsribed),
    /// false otherwise (and the mutex owner is notified)
    /// </returns>
    public static bool TryListenOrNotify(bool isSystemWide, string instanceName, Action callback)
    {
        var name = (isSystemWide ? "Global" : "Local") + "\\" + instanceName;

        var securityIdentifier = new SecurityIdentifier(WellKnownSidType.WorldSid, (SecurityIdentifier)null);
        var rule = new EventWaitHandleAccessRule(securityIdentifier, EventWaitHandleRights.FullControl, AccessControlType.Allow);
        var waitHandleSecurity = new EventWaitHandleSecurity();
        waitHandleSecurity.AddAccessRule(rule);

        bool createdNew;
        var eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, name, out createdNew, waitHandleSecurity);
        if(createdNew)
        {
            // mutex not acquired
            var thread = new Thread(() =>
            {
                using(eventWaitHandle)
                {
                    // listening for notifications
                    while(eventWaitHandle.WaitOne())
                    {
                        callback();
                    }
                }
            });
            thread.IsBackground = true;
            thread.Start();
            return true;
        }
        else
        {
            // mutex is not acquired
            using(eventWaitHandle)
            {
                // notifying the mutex owner
                eventWaitHandle.Set();
            }
            return false;
        }
    }

特别是,我不喜欢盲目地授予所有人所有权限。但我无法弄清楚默认安全设置是什么,在这种情况下设置的最小权限是什么?

谢谢。

0 个答案:

没有答案