Exemplo n.º 1
0
      public IAsyncResult BeginWrite(ReaderWriterGateCallback callback, Object state,
        AsyncCallback asyncCallback, Object asyncState) {
         AsyncResult<Object> ar = new AsyncResult<Object>(asyncCallback, asyncState);
         ReaderWriterGateReleaser releaser = new ReaderWriterGateReleaser(callback, this, false, state, ar);
         m_syncLock.Enter(true);
         switch (m_state) {
            case ReaderWriterGateStates.Free:             // If Free "RFW -> OBW, invoke, return
            case ReaderWriterGateStates.ReservedForWriter:
               m_state = ReaderWriterGateStates.OwnedByWriter;
               ThreadPool.QueueUserWorkItem(releaser.Invoke);
               break;

            case ReaderWriterGateStates.OwnedByReaders:   // If OBR | OBRAWP -> OBRAWP, queue, return
            case ReaderWriterGateStates.OwnedByReadersAndWriterPending:
               m_state = ReaderWriterGateStates.OwnedByReadersAndWriterPending;
               m_qWriteRequests.Enqueue(releaser);
               break;

            case ReaderWriterGateStates.OwnedByWriter:   // If OBW, queue, return
               m_qWriteRequests.Enqueue(releaser);
               break;
         }
         m_syncLock.Leave();
         return ar;
      }
Exemplo n.º 2
0
        public IAsyncResult BeginWrite(ReaderWriterGateCallback callback, Object state,
                                       AsyncCallback asyncCallback, Object asyncState)
        {
            AsyncResult <Object>     ar       = new AsyncResult <Object>(asyncCallback, asyncState);
            ReaderWriterGateReleaser releaser = new ReaderWriterGateReleaser(callback, this, false, state, ar);

            m_syncLock.Enter(true);
            switch (m_state)
            {
            case ReaderWriterGateStates.Free:             // If Free "RFW -> OBW, invoke, return
            case ReaderWriterGateStates.ReservedForWriter:
                m_state = ReaderWriterGateStates.OwnedByWriter;
                ThreadPool.QueueUserWorkItem(releaser.Invoke);
                break;

            case ReaderWriterGateStates.OwnedByReaders:   // If OBR | OBRAWP -> OBRAWP, queue, return
            case ReaderWriterGateStates.OwnedByReadersAndWriterPending:
                m_state = ReaderWriterGateStates.OwnedByReadersAndWriterPending;
                m_qWriteRequests.Enqueue(releaser);
                break;

            case ReaderWriterGateStates.OwnedByWriter:   // If OBW, queue, return
                m_qWriteRequests.Enqueue(releaser);
                break;
            }
            m_syncLock.Leave();
            return(ar);
        }
    // The code in this method has exclusive access to the catalog.
    private Object UpdateCatalog(ReaderWriterGateReleaser r)
    {
        CatalogEntry[] catalogEntries = (CatalogEntry[])r.State;
          // Update the catalog with the new entries...

          // When this method returns, exclusive access is relinquished.
          return null;
    }
    // The code in this method has shared read access to the catalog.
    private Object BuyCatalogProducts(ReaderWriterGateReleaser r)
    {
        using (r) {
         CatIDAndQuantity[] items = (CatIDAndQuantity[])r.State;
         foreach (CatIDAndQuantity item in items) {
            // Process each catalog item to build customer's order...
         }
          } // When r is Disposed, read access is relinquished.

          // Save customer's order to database
          // Send customer e-mail confirming order
          return null;
    }
        private void UpdateFile(ReaderWriterGateReleaser r)
        {
            // Update the file (NOTE: should be async I/O if file is on remote server)
             File.WriteAllText(m_filename, (String)r.State);

             // Update the time of the last update
             m_lastUpdate = DateTime.Now;
        }