Comparteix a través de


BlockingCollection<T>.TryTake Método

Definición

Intenta quitar un elemento de BlockingCollection<T>.

Sobrecargas

TryTake(T)

Intenta quitar un elemento de BlockingCollection<T>.

TryTake(T, TimeSpan)

Intenta quitar un elemento de BlockingCollection<T> dentro del período de tiempo especificado.

TryTake(T, Int32, CancellationToken)

Intenta quitar un elemento de BlockingCollection<T> dentro del período de tiempo especificado, observando un token de cancelación.

TryTake(T, Int32)

Intenta quitar un elemento de BlockingCollection<T> dentro del período de tiempo especificado.

Ejemplos

En el siguiente ejemplo, se muestra cómo utilizar el método TryTake.

class TryTakeDemo
{
    // Demonstrates:
    //      BlockingCollection<T>.Add()
    //      BlockingCollection<T>.CompleteAdding()
    //      BlockingCollection<T>.TryTake()
    //      BlockingCollection<T>.IsCompleted
    public static void BC_TryTake()
    {
        // Construct and fill our BlockingCollection
        using (BlockingCollection<int> bc = new BlockingCollection<int>())
        {
            int NUMITEMS = 10000;
            for (int i = 0; i < NUMITEMS; i++) bc.Add(i);
            bc.CompleteAdding();
            int outerSum = 0;

            // Delegate for consuming the BlockingCollection and adding up all items
            Action action = () =>
            {
                int localItem;
                int localSum = 0;

                while (bc.TryTake(out localItem)) localSum += localItem;
                Interlocked.Add(ref outerSum, localSum);
            };

            // Launch three parallel actions to consume the BlockingCollection
            Parallel.Invoke(action, action, action);

            Console.WriteLine("Sum[0..{0}) = {1}, should be {2}", NUMITEMS, outerSum, ((NUMITEMS * (NUMITEMS - 1)) / 2));
            Console.WriteLine("bc.IsCompleted = {0} (should be true)", bc.IsCompleted);
        }
    }
}
module TryTakeDemo =
    // Demonstrates:
    //      BlockingCollection<T>.Add()
    //      BlockingCollection<T>.CompleteAdding()
    //      BlockingCollection<T>.TryTake()
    //      BlockingCollection<T>.IsCompleted
    let blockingCollectionTryTake () =
        // Construct and fill our BlockingCollection
        use bc = new BlockingCollection<int>()
        let NUMITEMS = 10000;
        for i = 0 to NUMITEMS - 1 do
            bc.Add i
        bc.CompleteAdding()
        let mutable outerSum = 0

        // Delegate for consuming the BlockingCollection and adding up all items
        let action = 
            Action(fun () ->
                let mutable localItem = 0
                let mutable localSum = 0

                while bc.TryTake &localItem do
                    localSum <- localSum + localItem
                Interlocked.Add(&outerSum, localSum)
                |> ignore)

        // Launch three parallel actions to consume the BlockingCollection
        Parallel.Invoke(action, action, action)

        printfn $"Sum[0..{NUMITEMS}) = {outerSum}, should be {((NUMITEMS * (NUMITEMS - 1)) / 2)}"
        printfn $"bc.IsCompleted = {bc.IsCompleted} (should be true)"
'Imports System.Collections.Concurrent
'Imports System.Threading
'Imports System.Threading.Tasks

Class TryTakeDemo
    ' Demonstrates:
    ' BlockingCollection<T>.Add()
    ' BlockingCollection<T>.CompleteAdding()
    ' BlockingCollection<T>.TryTake()
    ' BlockingCollection<T>.IsCompleted
    Shared Sub BC_TryTake()
        ' Construct and fill our BlockingCollection
        Using bc As New BlockingCollection(Of Integer)()
            Dim NUMITEMS As Integer = 10000
            For i As Integer = 0 To NUMITEMS - 1
                bc.Add(i)
            Next
            bc.CompleteAdding()
            Dim outerSum As Integer = 0

            ' Delegate for consuming the BlockingCollection and adding up all items
            Dim action As Action =
                Sub()
                    Dim localItem As Integer
                    Dim localSum As Integer = 0

                    While bc.TryTake(localItem)
                        localSum += localItem
                    End While
                    Interlocked.Add(outerSum, localSum)
                End Sub

            ' Launch three parallel actions to consume the BlockingCollection
            Parallel.Invoke(action, action, action)

            Console.WriteLine("Sum[0..{0}) = {1}, should be {2}", NUMITEMS, outerSum, ((NUMITEMS * (NUMITEMS - 1)) / 2))
            Console.WriteLine("bc.IsCompleted = {0} (should be true)", bc.IsCompleted)
        End Using
    End Sub

End Class

TryTake(T)

Source:
BlockingCollection.cs
Source:
BlockingCollection.cs
Source:
BlockingCollection.cs

Intenta quitar un elemento de BlockingCollection<T>.

public:
 bool TryTake([Runtime::InteropServices::Out] T % item);
public bool TryTake (out T item);
member this.TryTake : 'T -> bool
Public Function TryTake (ByRef item As T) As Boolean

Parámetros

item
T

Elemento que va a quitarse de la colección.

Devoluciones

true si se pudo quitar un elemento; en caso contrario, false.

Excepciones

La colección subyacente se modificó fuera de esta instancia de BlockingCollection<T>.

Comentarios

Si la colección está vacía, este método devuelve inmediatamente false.

El orden en que se quita un elemento depende del tipo de colección usado para crear la instancia de BlockingCollection<T>. Cuando crea un objeto BlockingCollection<T>, puede especificar el tipo de colección que se va a usar. Por ejemplo, puede especificar un objeto ConcurrentQueue<T> para un comportamiento FIFO (primero en entrar, primero en salir) o un objeto ConcurrentStack<T> para un comportamiento LIFO (último en entrar, primero en salir). Puede usar cualquier clase de colección que implemente la interfaz IProducerConsumerCollection<T>. El tipo de colección predeterminado para BlockingCollection<T> es ConcurrentQueue<T>.

Consulte también

Se aplica a

TryTake(T, TimeSpan)

Source:
BlockingCollection.cs
Source:
BlockingCollection.cs
Source:
BlockingCollection.cs

Intenta quitar un elemento de BlockingCollection<T> dentro del período de tiempo especificado.

public:
 bool TryTake([Runtime::InteropServices::Out] T % item, TimeSpan timeout);
public bool TryTake (out T item, TimeSpan timeout);
member this.TryTake : 'T * TimeSpan -> bool
Public Function TryTake (ByRef item As T, timeout As TimeSpan) As Boolean

Parámetros

item
T

Elemento que va a quitarse de la colección.

timeout
TimeSpan

que TimeSpan representa el número de milisegundos que se van a esperar a que se quite el elemento, o que TimeSpan representa -1 milisegundos para esperar indefinidamente.

Devoluciones

true si se podría quitar un elemento de la colección dentro del tiempo especificado; de lo contrario, false.

Excepciones

timeout es un número negativo distinto de -1 milisegundos, que representa un tiempo de espera infinito.

O bien

timeout es mayor que Int32.MaxValue.

La colección subyacente se modificó fuera de esta instancia de BlockingCollection<T>.

Comentarios

El orden en que se quita un elemento depende del tipo de colección usado para crear la instancia de BlockingCollection<T>. Cuando crea un objeto BlockingCollection<T>, puede especificar el tipo de colección que se va a usar. Por ejemplo, puede especificar un objeto ConcurrentQueue<T> para un comportamiento FIFO (primero en entrar, primero en salir) o un objeto ConcurrentStack<T> para un comportamiento LIFO (último en entrar, primero en salir). Puede usar cualquier clase de colección que implemente la interfaz IProducerConsumerCollection<T>. El tipo de colección predeterminado para BlockingCollection<T> es ConcurrentQueue<T>.

Consulte también

Se aplica a

TryTake(T, Int32, CancellationToken)

Source:
BlockingCollection.cs
Source:
BlockingCollection.cs
Source:
BlockingCollection.cs

Intenta quitar un elemento de BlockingCollection<T> dentro del período de tiempo especificado, observando un token de cancelación.

public:
 bool TryTake([Runtime::InteropServices::Out] T % item, int millisecondsTimeout, System::Threading::CancellationToken cancellationToken);
public bool TryTake (out T item, int millisecondsTimeout, System.Threading.CancellationToken cancellationToken);
member this.TryTake : 'T * int * System.Threading.CancellationToken -> bool
Public Function TryTake (ByRef item As T, millisecondsTimeout As Integer, cancellationToken As CancellationToken) As Boolean

Parámetros

item
T

Elemento que va a quitarse de la colección.

millisecondsTimeout
Int32

El número de milisegundos que se van a esperar a que se quite el elemento o Infinite (-1) espere indefinidamente.

cancellationToken
CancellationToken

Token de cancelación que se va a observar.

Devoluciones

true si se podría quitar un elemento de la colección dentro del tiempo especificado; de lo contrario, false.

Excepciones

La BlockingCollection<T> se ha eliminado o el CancellationTokenSource subyacente se ha eliminado.

millisecondsTimeout es un número negativo distinto de-1, que representa un tiempo de espera infinito.

La colección subyacente se modificó fuera de esta instancia de BlockingCollection<T>.

Comentarios

El orden en que se quita un elemento depende del tipo de colección usado para crear la instancia de BlockingCollection<T>. Cuando crea un objeto BlockingCollection<T>, puede especificar el tipo de colección que se va a usar. Por ejemplo, puede especificar un objeto ConcurrentQueue<T> para un comportamiento FIFO (primero en entrar, primero en salir) o un objeto ConcurrentStack<T> para un comportamiento LIFO (último en entrar, primero en salir). Puede usar cualquier clase de colección que implemente la interfaz IProducerConsumerCollection<T>. El tipo de colección predeterminado para BlockingCollection<T> es ConcurrentQueue<T>.

Consulte también

Se aplica a

TryTake(T, Int32)

Source:
BlockingCollection.cs
Source:
BlockingCollection.cs
Source:
BlockingCollection.cs

Intenta quitar un elemento de BlockingCollection<T> dentro del período de tiempo especificado.

public:
 bool TryTake([Runtime::InteropServices::Out] T % item, int millisecondsTimeout);
public bool TryTake (out T item, int millisecondsTimeout);
member this.TryTake : 'T * int -> bool
Public Function TryTake (ByRef item As T, millisecondsTimeout As Integer) As Boolean

Parámetros

item
T

Elemento que va a quitarse de la colección.

millisecondsTimeout
Int32

El número de milisegundos que se van a esperar a que se quite el elemento o Infinite (-1) espere indefinidamente.

Devoluciones

true si se podría quitar un elemento de la colección dentro del tiempo especificado; de lo contrario, false.

Excepciones

millisecondsTimeout es un número negativo distinto de-1, que representa un tiempo de espera infinito.

La colección subyacente se modificó fuera de esta instancia de BlockingCollection<T>.

Comentarios

El orden en que se quita un elemento depende del tipo de colección usado para crear la instancia de BlockingCollection<T>. Al crear un BlockingCollection<T>, puede especificar el tipo de colección que se va a usar. Por ejemplo, puede especificar un objeto ConcurrentQueue<T> para un comportamiento FIFO (primero en entrar, primero en salir) o un objeto ConcurrentStack<T> para un comportamiento LIFO (último en entrar, primero en salir). Puede usar cualquier clase de colección que implemente la interfaz IProducerConsumerCollection<T>. El tipo de colección predeterminado para BlockingCollection<T> es ConcurrentQueue<T>.

Consulte también

Se aplica a