public Task WaitAsync(OneManyMode mode) { // 假定无竞争 Task accressGranter = m_noContentionAccessGranter; Lock(); switch (mode) { case OneManyMode.Exclusive: if (IsFree) { MakeWriter(); } else { // 有竞争: 新的writer任务进入队列,并返回它使writer等待 var tcs = new TaskCompletionSource <object>(); m_qWaitingWriters.Enqueue(tcs); accressGranter = tcs.Task; } break; case OneManyMode.Shared: if (IsFree || (IsOwnedByReaders && m_qWaitingWriters.Count == 0)) { AddReaders(1); } else { // 竞争:递增等待的reader数量,并返回reader任务使reader等待 m_numWaitingReaders++; accressGranter = m_waitingReadersSignal.Task.ContinueWith(t => { Console.WriteLine("所有写入完成了,读取开始"); }); } break; } UnLock(); return(accressGranter); }
/// <summary> /// Asynchronously requests access to the state protected by this AsyncOneManyLock /// </summary> /// <param name="mode">Specifies whether you want exclusive (write) access or shared (read) access.</param> /// <returns>A Task to await.</returns> public Task WaitAsync(OneManyMode mode) { Task accressGranter = m_noContentionAccessGranter; // Assume no contention Lock(); switch (mode) { case OneManyMode.Exclusive: if (IsFree) { MakeWriter(); // No contention } else { // Contention: Queue new writer task & return it so writer waits var tcs = new TaskCompletionSource <object>(); m_qWaitingWriters.Enqueue(tcs); accressGranter = tcs.Task; } break; case OneManyMode.Shared: if (IsFree || (IsOwnedByReaders && m_qWaitingWriters.Count == 0)) { AddReaders(1); // No contention } else { // Contention: Increment waiting readers & return reader task so reader waits m_numWaitingReaders++; accressGranter = m_waitingReadersSignal.Task.ContinueWith(t => t.Result); } break; } Unlock(); return(accressGranter); }
public Task WaitAsync(OneManyMode mode) { Task accressGranter = m_noContentionAccessGranter; Lock(); switch (mode) { case OneManyMode.Exclusive: if (IsFree) { MakeWriter(); } else { var tcs = new TaskCompletionSource <Object>(); m_qWaitingWriters.Enqueue(tcs); accressGranter = tcs.Task; } break; case OneManyMode.Shared: if (IsFree || (IsOwnedByReaders && m_qWaitingWriters.Count == 0)) { AddReaders(1); } else { m_numWaitingReader++; accressGranter = m_waitingReadersSignal.Task.ContinueWith(t => t.Result); } break; } Unlock(); return(accressGranter); }
public Task WaitAsync(OneManyMode mode) { var accressGranter = _noContentionAccessGranter; // Assume no contention Lock(); switch (mode) { case OneManyMode.Exclusive: if (IsFree) { MakeWriter(); // No contention } else { // Contention: Queue new writer task & return it so writer waits var tcs = new TaskCompletionSource<object>(); _qWaitingWriters.Enqueue(tcs); accressGranter = tcs.Task; } break; case OneManyMode.Shared: if (IsFree || (IsOwnedByReaders && _qWaitingWriters.Count == 0)) { AddReaders(1); // No contention } else { // Contention: Increment waiting readers & return reader task so reader waits _numWaitingReaders++; accressGranter = _waitingReadersSignal.Task.ContinueWith(t => t.Result); } break; } Unlock(); return accressGranter; }