BlockingCollection<T>.GetConsumingEnumerable Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет получающий интерфейс IEnumerable<T> для элементов коллекции.
Перегрузки
GetConsumingEnumerable(CancellationToken) |
Предоставляет получающий интерфейс IEnumerable<T> для элементов коллекции. |
GetConsumingEnumerable() |
Предоставляет получающий интерфейс IEnumerable<T> для элементов коллекции. |
GetConsumingEnumerable(CancellationToken)
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
Предоставляет получающий интерфейс IEnumerable<T> для элементов коллекции.
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
Маркер отмены, который следует контролировать.
Возвращаемое значение
Интерфейс IEnumerable<T>, удаляющий и возвращающий элементы из коллекции.
Исключения
Был удален BlockingCollection<T> или объект CancellationTokenSource, создавший cancellationToken
.
Комментарии
Этот метод позволяет клиентскому коду удалять элементы из коллекции с помощью цикла foreach (For Each в Visual Basic) или Parallel.ForEach запроса PLINQ. Перечислитель будет продолжать предоставлять элементы (если таковые существуют), пока не IsCompleted вернет значение true, а если IsCompleted имеет значение false, цикл блокируется до тех пор, пока элемент не станет доступным или пока не CancellationToken будет отменен.
См. также раздел
Применяется к
GetConsumingEnumerable()
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
Предоставляет получающий интерфейс IEnumerable<T> для элементов коллекции.
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>, удаляющий и возвращающий элементы из коллекции.
Исключения
Объект BlockingCollection<T> удален.
Примеры
В следующем примере показано, как использовать GetConsumingEnumerable метод :
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
}
}
}
module ConsumingEnumerableDemo =
// Demonstrates:
// BlockingCollection<T>.Add()
// BlockingCollection<T>.CompleteAdding()
// BlockingCollection<T>.GetConsumingEnumerable()
let blockingCollectionGetConsumingEnumerable () =
task {
use bc = new BlockingCollection<int>()
// Kick off a producer task
let producerTask =
task {
for i = 0 to 9 do
bc.Add i
printfn $"Producing: {i}"
do! 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.
for item in bc.GetConsumingEnumerable() do
printfn $"Consuming: {item}"
do! 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