BlockingCollection<T>.TryTake Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Пытается удалить элемент из коллекции BlockingCollection<T>.
Перегрузки
TryTake(T) |
Пытается удалить элемент из коллекции BlockingCollection<T>. |
TryTake(T, TimeSpan) |
Пытается удалить элемент из коллекции BlockingCollection<T> в течение указанного периода времени. |
TryTake(T, Int32, CancellationToken) |
Пытается удалить элемент из коллекции BlockingCollection<T> в течение указанного периода времени, контролируя маркер отмены. |
TryTake(T, Int32) |
Пытается удалить элемент из коллекции BlockingCollection<T> в течение указанного периода времени. |
Примеры
В следующем примере показано, как использовать метод 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)
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
Пытается удалить элемент из коллекции 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
Параметры
- item
- T
Элемент, который необходимо удалить из коллекции.
Возвращаемое значение
Значение true
, если элемент удалось удалить; в противном случае — значение false
.
Исключения
Объект BlockingCollection<T> удален.
Базовая коллекция была изменена за пределами этого экземпляра BlockingCollection<T>.
Комментарии
Если коллекция пуста, этот метод немедленно возвращает значение false.
Порядок, в котором удаляется элемент, зависит от типа коллекции, использованного для создания экземпляра BlockingCollection<T>. При создании объекта BlockingCollection<T> можно указать тип коллекции для использования. Например, можно задать объект ConcurrentQueue<T> для использования принципа "первым поступил — первым обслужен", или объект ConcurrentStack<T> для использования принципа "последним поступил — первым обслужен". Использовать можно любой класс коллекции, реализующий интерфейс IProducerConsumerCollection<T>. Тип коллекции, используемый в классе BlockingCollection<T> по умолчанию — это ConcurrentQueue<T>.
См. также раздел
Применяется к
TryTake(T, TimeSpan)
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
Пытается удалить элемент из коллекции BlockingCollection<T> в течение указанного периода времени.
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
Параметры
- item
- T
Элемент, который необходимо удалить из коллекции.
- timeout
- TimeSpan
Объект , TimeSpan представляющий количество миллисекундах для ожидания удаления элемента, или значение TimeSpan , представляющее -1 миллисекунда для неограниченного ожидания.
Возвращаемое значение
true
Значение , если элемент может быть удален из коллекции в течение указанного времени; в противном случае — false
.
Исключения
Объект BlockingCollection<T> удален.
timeout
является отрицательным числом, отличным от -1 миллисекунды, которое представляет неограниченное время ожидания.
-или-
timeout
больше, чем Int32.MaxValue.
Базовая коллекция была изменена за пределами этого экземпляра BlockingCollection<T>.
Комментарии
Порядок, в котором удаляется элемент, зависит от типа коллекции, использованного для создания экземпляра BlockingCollection<T>. При создании объекта BlockingCollection<T> можно указать тип коллекции для использования. Например, можно задать объект ConcurrentQueue<T> для использования принципа "первым поступил — первым обслужен", или объект ConcurrentStack<T> для использования принципа "последним поступил — первым обслужен". Использовать можно любой класс коллекции, реализующий интерфейс IProducerConsumerCollection<T>. Тип коллекции, используемый в классе BlockingCollection<T> по умолчанию — это ConcurrentQueue<T>.
См. также раздел
Применяется к
TryTake(T, Int32, CancellationToken)
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
Пытается удалить элемент из коллекции BlockingCollection<T> в течение указанного периода времени, контролируя маркер отмены.
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
Параметры
- item
- T
Элемент, который необходимо удалить из коллекции.
- millisecondsTimeout
- Int32
Время ожидания удаления элемента в миллисекундах или Infinite (–1) неограниченное ожидание.
- cancellationToken
- CancellationToken
Маркер отмены, который следует контролировать.
Возвращаемое значение
true
Значение , если элемент может быть удален из коллекции в течение указанного времени; в противном случае — false
.
Исключения
CancellationToken был отменен.
Объект BlockingCollection<T> был удален или базовый объект CancellationTokenSource был удален.
Параметр millisecondsTimeout
является отрицательным числом, отличным от –1, что означает бесконечное время ожидания.
Базовая коллекция была изменена за пределами этого экземпляра BlockingCollection<T>.
Комментарии
Порядок, в котором удаляется элемент, зависит от типа коллекции, использованного для создания экземпляра BlockingCollection<T>. При создании объекта BlockingCollection<T> можно указать тип коллекции для использования. Например, можно задать объект ConcurrentQueue<T> для использования принципа "первым поступил — первым обслужен", или объект ConcurrentStack<T> для использования принципа "последним поступил — первым обслужен". Использовать можно любой класс коллекции, реализующий интерфейс IProducerConsumerCollection<T>. Тип коллекции, используемый в классе BlockingCollection<T> по умолчанию — это ConcurrentQueue<T>.
См. также раздел
Применяется к
TryTake(T, Int32)
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
- Исходный код:
- BlockingCollection.cs
Пытается удалить элемент из коллекции BlockingCollection<T> в течение указанного периода времени.
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
Параметры
- item
- T
Элемент, который необходимо удалить из коллекции.
- millisecondsTimeout
- Int32
Время ожидания удаления элемента в миллисекундах или Infinite (–1) неограниченное ожидание.
Возвращаемое значение
true
Значение , если элемент может быть удален из коллекции в течение указанного времени; в противном случае — false
.
Исключения
Объект BlockingCollection<T> удален.
Параметр millisecondsTimeout
является отрицательным числом, отличным от –1, что означает бесконечное время ожидания.
Базовая коллекция была изменена за пределами этого экземпляра BlockingCollection<T>.
Комментарии
Порядок, в котором удаляется элемент, зависит от типа коллекции, использованного для создания экземпляра BlockingCollection<T>. При создании BlockingCollection<T>можно указать тип используемой коллекции. Например, можно задать объект ConcurrentQueue<T> для использования принципа "первым поступил — первым обслужен", или объект ConcurrentStack<T> для использования принципа "последним поступил — первым обслужен". Использовать можно любой класс коллекции, реализующий интерфейс IProducerConsumerCollection<T>. Тип коллекции, используемый в классе BlockingCollection<T> по умолчанию — это ConcurrentQueue<T>.