BlockingCollection<T>.TryTake Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Pokusí se odebrat položku z objektu BlockingCollection<T>.
Přetížení
TryTake(T) |
Pokusí se odebrat položku z objektu BlockingCollection<T>. |
TryTake(T, TimeSpan) |
Pokusí se odebrat položku z objektu BlockingCollection<T> v zadaném časovém období. |
TryTake(T, Int32, CancellationToken) |
Pokusí se odebrat položku z objektu BlockingCollection<T> v zadaném časovém období při sledování tokenu zrušení. |
TryTake(T, Int32) |
Pokusí se odebrat položku z objektu BlockingCollection<T> v zadaném časovém období. |
Příklady
Následující příklad ukazuje, jak používat metodu 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)
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
Pokusí se odebrat položku z objektu 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
Parametry
- item
- T
Položka, která má být odebrána z kolekce
Návraty
true
pokud lze položku odebrat; v opačném případě . false
Výjimky
Byla BlockingCollection<T> zlikvidována.
Podkladová kolekce byla změněna mimo tuto BlockingCollection<T> instanci.
Poznámky
Pokud je kolekce prázdná, tato metoda okamžitě vrátí hodnotu false.
Pořadí, ve kterém je položka odebrána, závisí na typu kolekce použité k vytvoření BlockingCollection<T> instance. Při vytváření objektu BlockingCollection<T> můžete určit typ kolekce, která se má použít. Můžete například zadat ConcurrentQueue<T> objekt pro chování FIFO (first in, first out) nebo ConcurrentStack<T> objekt pro chování lifo (last in, first out). Můžete použít libovolnou třídu kolekce, která implementuje IProducerConsumerCollection<T> rozhraní . Výchozí typ kolekce pro BlockingCollection<T> je ConcurrentQueue<T>.
Viz také
Platí pro
TryTake(T, TimeSpan)
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
Pokusí se odebrat položku z objektu BlockingCollection<T> v zadaném časovém období.
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
Parametry
- item
- T
Položka, která má být odebrána z kolekce
- timeout
- TimeSpan
A TimeSpan , který představuje počet milisekund čekat na položku bude odebrána, nebo představuje TimeSpan -1 milisekund čekat neomezeně dlouho.
Návraty
true
pokud lze položku odebrat z kolekce v určeném čase; v opačném případě . false
Výjimky
Byla BlockingCollection<T> zlikvidována.
timeout
je záporné číslo jiné než -1 milisekund, které představuje nekonečný časový limit.
-nebo-
timeout
je větší než Int32.MaxValue.
Podkladová kolekce byla změněna mimo tuto BlockingCollection<T> instanci.
Poznámky
Pořadí, ve kterém je položka odebrána, závisí na typu kolekce použité k vytvoření BlockingCollection<T> instance. Při vytváření objektu BlockingCollection<T> můžete určit typ kolekce, která se má použít. Můžete například zadat ConcurrentQueue<T> objekt pro chování FIFO (first in, first out) nebo ConcurrentStack<T> objekt pro chování lifo (last in, first out). Můžete použít libovolnou třídu kolekce, která implementuje IProducerConsumerCollection<T> rozhraní . Výchozí typ kolekce pro BlockingCollection<T> je ConcurrentQueue<T>.
Viz také
Platí pro
TryTake(T, Int32, CancellationToken)
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
Pokusí se odebrat položku z objektu BlockingCollection<T> v zadaném časovém období při sledování tokenu zrušení.
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
Parametry
- item
- T
Položka, která má být odebrána z kolekce
- millisecondsTimeout
- Int32
Počet milisekund, které mají čekat na odebrání položky, nebo Infinite (-1) čekat neomezeně.
- cancellationToken
- CancellationToken
Token zrušení, který se má sledovat.
Návraty
true
pokud lze položku odebrat z kolekce v určeném čase; v opačném případě . false
Výjimky
Služba CancellationToken byla zrušena.
Byla BlockingCollection<T> odstraněna nebo byla odstraněna podkladová CancellationTokenSource hodnota.
millisecondsTimeout
je záporné číslo jiné než -1, které představuje nekonečný časový limit.
Podkladová kolekce byla změněna mimo tuto BlockingCollection<T> instanci.
Poznámky
Pořadí, ve kterém je položka odebrána, závisí na typu kolekce použité k vytvoření BlockingCollection<T> instance. Při vytváření objektu BlockingCollection<T> můžete určit typ kolekce, která se má použít. Můžete například zadat ConcurrentQueue<T> objekt pro chování FIFO (first in, first out) nebo ConcurrentStack<T> objekt pro chování lifo (last in, first out). Můžete použít libovolnou třídu kolekce, která implementuje IProducerConsumerCollection<T> rozhraní . Výchozí typ kolekce pro BlockingCollection<T> je ConcurrentQueue<T>.
Viz také
Platí pro
TryTake(T, Int32)
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
- Zdroj:
- BlockingCollection.cs
Pokusí se odebrat položku z objektu BlockingCollection<T> v zadaném časovém období.
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
Parametry
- item
- T
Položka, která má být odebrána z kolekce
- millisecondsTimeout
- Int32
Počet milisekund, které mají čekat na odebrání položky, nebo Infinite (-1) čekat neomezeně.
Návraty
true
pokud lze položku odebrat z kolekce v určeném čase; v opačném případě . false
Výjimky
Byla BlockingCollection<T> zlikvidována.
millisecondsTimeout
je záporné číslo jiné než -1, které představuje nekonečný časový limit.
Podkladová kolekce byla změněna mimo tuto BlockingCollection<T> instanci.
Poznámky
Pořadí, ve kterém je položka odebrána, závisí na typu kolekce použité k vytvoření BlockingCollection<T> instance. Při vytváření objektu BlockingCollection<T>můžete zadat typ kolekce, která se má použít. Můžete například zadat ConcurrentQueue<T> objekt pro chování FIFO (first in, first out) nebo ConcurrentStack<T> objekt pro chování lifo (last in, first out). Můžete použít libovolnou třídu kolekce, která implementuje IProducerConsumerCollection<T> rozhraní . Výchozí typ kolekce pro BlockingCollection<T> je ConcurrentQueue<T>.