C#之TryDequeue

ConcurrentQueue<T>.TryDequeue(T) 方法

定义

命名空间:

System.Collections.Concurrent

程序集:

System.Collections.Concurrent.dll, mscorlib.dll, netstandard.dll

尝试移除并返回并发队列开头处的对象。

C#

public bool TryDequeue (out T result);

参数

result

T

如果操作成功,则此方法返回时,result 包含所移除的对象。 如果没有可供移除的对象,则不指定该值。

返回

Boolean

如果成功在 true 开头处移除并返回了元素,则为 ConcurrentQueue<T>;否则为 false

注解

ConcurrentQueue<T> 在内部处理所有同步。 如果两个线程正好在同一时间调用 TryDequeue,则不会阻止任一操作。 如果在两个线程之间检测到冲突,则一个线程必须再次尝试检索下一元素,并且将内部处理同步。

TryDequeue 尝试从队列中删除元素。 如果此方法成功,则将删除该项,并且此方法将返回 true;否则将返回 false。 对于队列中的其他操作而言,这将以原子方式发生。 如果队列是使用代码(如 q.Enqueue("a"); q.Enqueue("b"); q.Enqueue("c");)填充的,并且两个线程同时尝试取消元素排队,则一个线程将取消 a 排队,而另一个线程将取消 b 排队。 对 TryDequeue 的两个调用均将返回 true,因为它们都能取消元素排队。 如果每个线程都返回取消附加元素排队,则一个线程将取消 c 排队并返回 true,而另一个线程将发现队列为空并返回 false

适用于

.NET Core

3.1 3.0 2.2 2.1 2.0 1.1 1.0

.NET Framework

4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6 4.5.2 4.5.1 4.5 4.0

.NET Standard

2.1 2.0 1.6 1.4 1.3 1.2 1.1

UWP

10.0

Xamarin.Android

7.1

Xamarin.iOS

10.8

Xamarin.Mac

3.0

另请参阅

### C# 中 `TryDequeue` 和 `Enqueue` 方法的使用及区别 #### TryDequeue 方法详解 `TryDequeue` 是一种用于从队列中移除并获取位于队列头部元素的方法。此操作具有原子性,意味着它要么完全执行成功,要么根本不发生任何变化。该方法接受一个输出参数用来存储被取出的数据项,并返回一个布尔值表示操作是否成功。 对于非并发环境下的标准泛型集合类 `Queue<T>` 来说, 可以通过如下方式调用: ```csharp bool success = queue.TryDequeue(out T item); if(success){ Console.WriteLine($"已成功取出了项目: {item}"); } else{ Console.WriteLine("未能取出项目"); } ``` 而在多线程场景下推荐使用的 `ConcurrentQueue<T>`, 则提供了更安全可靠的实现版本[^3]: ```csharp // ConcurrentQueue 版本 var concurrentQueue = new System.Collections.Concurrent.ConcurrentQueue<int>(); concurrentQueue.Enqueue(10); if(concurrentQueue.TryDequeue(out int dequeuedItem)){ Console.WriteLine($"已成功取出并发队列中的项目: {dequeuedItem}"); } else { Console.WriteLine("并发队列为空或无法取出项目"); } ``` #### Enqueue 方法详解 相对应地,`Enqueue` 负责向队列尾部添加新成员。同样存在两种主要形式——适用于单线程上下文的标准版以及针对高并发情况优化过的增强型。 常规做法是在普通的 `Queue<T>` 上直接追加数据: ```csharp var simpleQueue = new Queue<string>(); simpleQueue.Enqueue("第一个字符串"); Console.WriteLine(simpleQueue.Peek()); // 输出 "第一个字符串" ``` 当涉及到多个生产者/消费者模式时,则应该考虑采用支持同步机制的变体即 `ConcurrentQueue<T>.Enqueue()` : ```csharp // 并发环境下入队 var concurrentQueueExample = new System.Collections.Concurrent.ConcurrentQueue<object>(); for(int i=0;i<5;i++){ concurrentQueueExample.Enqueue(i.ToString()); } while(!concurrentQueueExample.IsEmpty){ if(concurrentQueueExample.TryDequeue(out object obj)) Console.Write(obj + ", "); } ``` 以上代码片段展示了如何利用这两种不同类型的队列结构来进行基本的操作演示[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值