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