예제 #1
0
        /// <inheritdoc/>
        public TData Dequeue()
        {
            try
            {
                rwLock.EnterUpgradeableReadLock();
                try
                {
                    // 先由目前的out取值
                    TData result = outContainer.GetIfAny();
                    if (result != null && result.Equals(default(TData)) == false)
                    {
                        return(result);
                    }

                    // 目前out裏沒資料的話,就切換
                    SwitchQueue();

                    // 再由新的out取值
                    result = outContainer.GetIfAny();
                    // 要先比是否為null,是因為如果為非原生型別(ex. int)的話,要先確認是否為null
                    // 原生型別的話則要用第二段的Equals()來確認是否為預設值
                    if (result != null && result.Equals(default(TData)) == false)
                    {
                        return(result);
                    }

                    return(default(TData));
                }
                finally
                {
                    rwLock.ExitUpgradeableReadLock();
                }
            }
            catch
            {
                return(default(TData));
            }
        }