示例#1
0
 protected override void CleanUpResources()
 {
     try
     {
         NewMessageSignal.Set();
     }
     finally
     {
         base.CleanUpResources();
     }
 }
 public unsafe void Write(byte[] data)
 {
     lock (DisposeLock)                 // If there are multiple threads, write just one message at a time
     {
         AssertSafe();
         if (data.Length > Length - Offset - 8)
         {
             // Not enough space left in the shared memory buffer to write the message.
             WriteContinuation(data.Length);
         }
         WriteMessage(data);
         NewMessageSignal.Set();    // Signal reader that a message is available
     }
 }
        void Go()
        {
            int spinCycles = 0;

            while (true)
            {
                int?latestMessageID = GetLatestMessageID();
                if (latestMessageID == null)
                {
                    return;                                     // We've been disposed.
                }
                if (latestMessageID > _lastMessageProcessed)
                {
                    Thread.MemoryBarrier();    // We need this because of lock-free implementation
                    byte[] msg = GetNextMessage();
                    if (msg == null)
                    {
                        return;
                    }
                    if (msg.Length > 0 && _onMessage != null)
                    {
                        _onMessage(msg);                                             // Zero-length msg will be a buffer continuation
                    }
                    spinCycles = 1000;
                }
                if (spinCycles == 0)
                {
                    NewMessageSignal.WaitOne();
                    if (IsDisposed)
                    {
                        return;
                    }
                }
                else
                {
                    Thread.MemoryBarrier();    // We need this because of lock-free implementation
                    spinCycles--;
                }
            }
        }
 protected override void DisposeCore()
 {
     NewMessageSignal.Set();
     base.DisposeCore();
 }