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; }
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; }