Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
    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;
        }