一直在考虑SharedMemory/SharedMemoryEx的并发问题..就是怎么处理同时有多个线程/进程读/写时怎么保证内容是正确的..
想到了Mutex,进程间的互斥体.
看了看MSDN,发现不能在多个进程中进行互斥操作:)
于是使用P/Invoke大法,封装了Win32中的OpenMutex/CreateMutex等类.写了一个MutexEx.
代码如下:

    Enum MutexExAccessTypes#region Enum MutexExAccessTypes
    public enum MutexExAccessTypes:int

    
{
        MUTEX_ALL_ACCESS = 0x1F0001,
        MUTEX_MODIFY_STATE = 0x1,
    }
    #endregion


    Class MutexEx#region Class MutexEx

    /**//// <summary>
    /// Summary description for Win32Mutex.
    /// </summary>
    public class MutexEx : IDisposable

    
{

        DllImport#region DllImport
        [DllImport("kernel32.dll")]
        static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner,
            string lpName);

        [DllImport("kernel32.dll")]
        static extern IntPtr OpenMutex(uint dwDesiredAccess, bool bInheritHandle,
            string lpName);

        [DllImport("kernel32.dll")]
        static extern bool ReleaseMutex(IntPtr hMutex);

        [DllImport("kernel32.dll", SetLastError=true)]
        static extern int CloseHandle(IntPtr hObject);

        [DllImport("kernel32.dll")]
        static extern uint WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds);
        #endregion


        Private varialbe & Propery#region Private varialbe & Propery
        protected const uint INFINITE = 0xFFFFFFFF;
        private string name;
        private bool bOwner;
        private IntPtr hMutex;
        #endregion


        Constructor & Dispose#region Constructor & Dispose

        public MutexEx()
{}

        public MutexEx(string Name):this(Name,false)
{}
        public MutexEx(string Name,bool bInitialOwner)

        
{
            Create(Name,bInitialOwner);
        }

        public void Close()

        
{
            if( hMutex != IntPtr.Zero)

            
{
                CloseHandle(hMutex);
                hMutex = IntPtr.Zero;
            }
        }
        
        public void Dispose()

        
{
            Close();
        }
        #endregion


        Common Function#region Common Function
        public void Create(string Name)

        
{
            Create(Name,false);
        }

        public void Create(string Name,bool bInitialOwner)

        
{
            name = Name;
            bOwner = bInitialOwner;
            hMutex = CreateMutex(IntPtr.Zero,bInitialOwner,Name);
            if( hMutex == IntPtr.Zero)

            
{
                throw new ApplicationException("Can't Create Mutex " + Name);
            }
        }

        public void Open(string Name)

        
{
            Open(Name,false,MutexExAccessTypes.MUTEX_ALL_ACCESS);
        }

        public void Open(string Name,MutexExAccessTypes Access)

        
{
            Open(Name,false,Access);
        }

        public void Open(string Name,bool bInitialOwner,MutexExAccessTypes Access)

        
{
            name = Name;
            bOwner = bInitialOwner;
            hMutex = OpenMutex( (uint)Access,bInitialOwner,Name);
            if( hMutex == IntPtr.Zero)

            
{
                throw new ApplicationException("Can't Open Mutex " + Name);
            }
        }

        public uint Wait()

        
{
            return Wait(INFINITE);
        }

        public uint Wait(uint dwMilliseconds)

        
{
            return WaitForSingleObject(hMutex,dwMilliseconds);
        }

        public void Release()

        
{
            ReleaseMutex(hMutex);
        }
        #endregion
    }
    #endregion
代码下载 : MutexEx.zip
想到了Mutex,进程间的互斥体.
看了看MSDN,发现不能在多个进程中进行互斥操作:)
于是使用P/Invoke大法,封装了Win32中的OpenMutex/CreateMutex等类.写了一个MutexEx.
代码如下:

    Enum MutexExAccessTypes#region Enum MutexExAccessTypes
    public enum MutexExAccessTypes:int
    
{
        MUTEX_ALL_ACCESS = 0x1F0001,
        MUTEX_MODIFY_STATE = 0x1,
    }
    #endregion

    Class MutexEx#region Class MutexEx
    /**//// <summary>
    /// Summary description for Win32Mutex.
    /// </summary>
    public class MutexEx : IDisposable
    
{
        DllImport#region DllImport
        [DllImport("kernel32.dll")]
        static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner,
            string lpName);
        [DllImport("kernel32.dll")]
        static extern IntPtr OpenMutex(uint dwDesiredAccess, bool bInheritHandle,
            string lpName);
        [DllImport("kernel32.dll")]
        static extern bool ReleaseMutex(IntPtr hMutex);
        [DllImport("kernel32.dll", SetLastError=true)]
        static extern int CloseHandle(IntPtr hObject);
        [DllImport("kernel32.dll")]
        static extern uint WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds);
        #endregion

        Private varialbe & Propery#region Private varialbe & Propery
        protected const uint INFINITE = 0xFFFFFFFF;
        private string name;
        private bool bOwner;
        private IntPtr hMutex;
        #endregion

        Constructor & Dispose#region Constructor & Dispose
        public MutexEx()
{}
        public MutexEx(string Name):this(Name,false)
{}
        public MutexEx(string Name,bool bInitialOwner)
        
{
            Create(Name,bInitialOwner);
        }
        public void Close()
        
{
            if( hMutex != IntPtr.Zero)
            
{
                CloseHandle(hMutex);
                hMutex = IntPtr.Zero;
            }
        }
        
        public void Dispose()
        
{
            Close();
        }
        #endregion

        Common Function#region Common Function
        public void Create(string Name)
        
{
            Create(Name,false);
        }
        public void Create(string Name,bool bInitialOwner)
        
{
            name = Name;
            bOwner = bInitialOwner;
            hMutex = CreateMutex(IntPtr.Zero,bInitialOwner,Name);
            if( hMutex == IntPtr.Zero)
            
{
                throw new ApplicationException("Can't Create Mutex " + Name);
            }
        }
        public void Open(string Name)
        
{
            Open(Name,false,MutexExAccessTypes.MUTEX_ALL_ACCESS);
        }
        public void Open(string Name,MutexExAccessTypes Access)
        
{
            Open(Name,false,Access);
        }
        public void Open(string Name,bool bInitialOwner,MutexExAccessTypes Access)
        
{
            name = Name;
            bOwner = bInitialOwner;
            hMutex = OpenMutex( (uint)Access,bInitialOwner,Name);
            if( hMutex == IntPtr.Zero)
            
{
                throw new ApplicationException("Can't Open Mutex " + Name);
            }
        }
        public uint Wait()
        
{
            return Wait(INFINITE);
        }
        public uint Wait(uint dwMilliseconds)
        
{
            return WaitForSingleObject(hMutex,dwMilliseconds);
        }
        public void Release()
        
{
            ReleaseMutex(hMutex);
        }
        #endregion
    }
    #endregion代码下载 : MutexEx.zip
                    
                
                
            
        
浙公网安备 33010602011771号