BlockingCollection<T>.GetConsumingEnumerable 方法

定义

为集合中的项提供一个使用 IEnumerator<T>Provides a consuming IEnumerator<T> for items in the collection.

重载

GetConsumingEnumerable(CancellationToken)

为集合中的项提供一个使用 IEnumerable<T>Provides a consuming IEnumerable<T> for items in the collection.

GetConsumingEnumerable()

为集合中的项提供一个使用 IEnumerator<T>Provides a consuming IEnumerator<T> for items in the collection.

GetConsumingEnumerable(CancellationToken)

为集合中的项提供一个使用 IEnumerable<T>Provides a consuming IEnumerable<T> for items in the collection.

public:
 System::Collections::Generic::IEnumerable<T> ^ GetConsumingEnumerable(System::Threading::CancellationToken cancellationToken);
public System.Collections.Generic.IEnumerable<T> GetConsumingEnumerable (System.Threading.CancellationToken cancellationToken);
member this.GetConsumingEnumerable : System.Threading.CancellationToken -> seq<'T>
Public Function GetConsumingEnumerable (cancellationToken As CancellationToken) As IEnumerable(Of T)
Public Iterator Function GetConsumingEnumerable (cancellationToken As CancellationToken) As IEnumerable(Of T)

参数

cancellationToken
CancellationToken

要观察的取消标记。A cancellation token to observe.

返回

IEnumerable<T>

从集合中移除并返回项的 IEnumerable<T>An IEnumerable<T> that removes and returns items from the collection.

例外

如果已取消 CancellationTokenIf the CancellationToken is canceled.

已释放 BlockingCollection<T>,或已释放创建 cancellationTokenCancellationTokenSourceThe BlockingCollection<T> has been disposed or the CancellationTokenSource that created cancellationToken has been disposed

注解

此方法使客户端代码可以通过使用 Visual Basic) 或 PLINQ 查询中的每个 (的 foreach 循环来删除集合中的项 Parallel.ForEachThis method enables client code to remove items from the collection by using a foreach loop (For Each in Visual Basic), or Parallel.ForEach or a PLINQ query. 如果) 存在,则枚举器将继续提供 (项 IsCompleted ,直到返回 true; 如果 IsCompleted 为 false,则循环会阻止到项可用或直到 CancellationToken 取消为止。The enumerator will continue to provide items (if any exist) until IsCompleted returns true, and if IsCompleted is false the loop blocks until an item becomes available or until the CancellationToken is cancelled.

适用于

GetConsumingEnumerable()

为集合中的项提供一个使用 IEnumerator<T>Provides a consuming IEnumerator<T> for items in the collection.

public:
 System::Collections::Generic::IEnumerable<T> ^ GetConsumingEnumerable();
public System.Collections.Generic.IEnumerable<T> GetConsumingEnumerable ();
member this.GetConsumingEnumerable : unit -> seq<'T>
Public Function GetConsumingEnumerable () As IEnumerable(Of T)

返回

IEnumerable<T>

从集合中移除并返回项的 IEnumerable<T>An IEnumerable<T> that removes and returns items from the collection.

例外

示例

下面的示例演示如何使用 GetConsumingEnumerable 方法:The following example shows how to use the GetConsumingEnumerable method:

class ConsumingEnumerableDemo
{
    // Demonstrates:
    //      BlockingCollection<T>.Add()
    //      BlockingCollection<T>.CompleteAdding()
    //      BlockingCollection<T>.GetConsumingEnumerable()
    public static async Task BC_GetConsumingEnumerable()
    {
        using (BlockingCollection<int> bc = new BlockingCollection<int>())
        {
            // Kick off a producer task
            var producerTask = Task.Run(async () =>
            {
                for (int i = 0; i < 10; i++)
                {
                    bc.Add(i);
                    Console.WriteLine($"Producing: {i}");

                    await Task.Delay(100); // sleep 100 ms between adds
                }

                // Need to do this to keep foreach below from hanging
                bc.CompleteAdding();
            });

            // Now consume the blocking collection with foreach.
            // Use bc.GetConsumingEnumerable() instead of just bc because the
            // former will block waiting for completion and the latter will
            // simply take a snapshot of the current state of the underlying collection.
            foreach (var item in bc.GetConsumingEnumerable())
            {
                Console.WriteLine($"Consuming: {item}");
            }
            await producerTask; // Allow task to complete cleanup
        }
    }
}
'Imports System.Threading.Tasks
'Imports System.Collections.Concurrent

' Demonstrates:
' BlockingCollection<T>.Add()
' BlockingCollection<T>.CompleteAdding()
' BlockingCollection<T>.GetConsumingEnumerable()

Class ConsumingEnumerableDemo
    Shared Sub BC_GetConsumingEnumerable()
        Using bc As New BlockingCollection(Of Integer)()

            ' Kick off a producer task
            Task.Factory.StartNew(
                Sub()
                    For i As Integer = 0 To 9
                        bc.Add(i)
                        ' sleep 100 ms between adds
                        Thread.Sleep(100)
                    Next

                    ' Need to do this to keep foreach below from not responding.
                    bc.CompleteAdding()
                End Sub)
            ' Now consume the blocking collection with foreach.
            ' Use bc.GetConsumingEnumerable() instead of just bc because the
            ' former will block waiting for completion and the latter will
            ' simply take a snapshot of the current state of the underlying collection.
            For Each item In bc.GetConsumingEnumerable()
                Console.WriteLine(item)
            Next
        End Using
    End Sub
End Class

适用于