bool TryAdd(Π’ item) bool TryTake(out T item)
ΠΠ΅ΡΠΎΠ΄ TryAdd () Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true, Π΅ΡΠ»ΠΈ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ i tem. Π ΠΌΠ΅ΡΠΎΠ΄ TryTake () Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true, Π΅ΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ i tem ΡΠ΄Π°Π»Π΅Π½ ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ. ΠΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ TryAdd () Π²ΡΠΏΠΎΠ»Π½Π΅Π½ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ i tern Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ. (ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ IProducerConsumerCollection ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°Π΅ΠΌΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Π° CopyTo (), ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ICollection, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° Π’ΠΎΠΠ³Π³Π°Ρ (), ΠΊΠΎΠΏΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π² ΠΌΠ°ΡΡΠΈΠ².)
ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Π·Π°ΡΠ°ΡΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ²Π°Π½ΠΈΡ Π·Π°Π΄Π°Ρ (TPL) ΠΈΠ»ΠΈ ΡΠ·ΡΠΊΠΎΠΌ PLINQ. Π ΡΠΈΠ»Ρ ΠΎΡΠΎΠ±ΠΎΠ³ΠΎ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ° ΡΡΠΈΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ Π²ΡΠ΅ ΠΈΡ ΠΊΠ»Π°ΡΡΡ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π΄Π°Π½ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ ΠΊΠ»Π°ΡΡΠ° BlockingCollection<T>. Π£ΡΠ²ΠΎΠΈΠ² ΠΎΡΠ½ΠΎΠ²Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° BlockingCollection<T>, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π±Π΅Π· ΠΎΡΠΎΠ±ΠΎΠ³ΠΎ ΡΡΡΠ΄Π° ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ ΠΈ Π² ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ.
Π ΠΊΠ»Π°ΡΡΠ΅ BlockingCollection<T>, ΠΏΠΎ ΡΡΡΠ΅ΡΡΠ²Ρ, ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ°Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π² ΡΠ°ΠΊΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π»ΡΠ±ΡΡ ΠΏΠΎΠΏΡΡΠΎΠΊ Π²ΡΡΠ°Π²ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡΡΠΎΠΊ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° ΠΏΡΡΡΠ°. ΠΡΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ΅Ρ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½Π° "ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ". Π ΠΊΠ»Π°ΡΡΠ΅ BlockingCollection<T> ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ICollection, IEnumerable, IEnumerable<T>, Π° ΡΠ°ΠΊΠΆΠ΅ IDisposable.
Π ΠΊΠ»Π°ΡΡΠ΅ BlockingCollection<T> ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ.
public BlockingCollection()
public BlockingCollection(int boundedCapacity)
public BlockingCollection(IProducerConsumerCollection<T> collection) public BlockingCollection(IProducerConsumerCollection<T> collection,
int boundedCapacity)
Π Π΄Π²ΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°Ρ Π² ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ ΠΊΠ»Π°ΡΡΠ° BlockingCollection<T> Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΡΠ²Π»ΡΡΡΠ°ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° ConcurrentQueue<T>. Π Π² Π΄Π²ΡΡ Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° Π² ΠΎΡΠ½ΠΎΠ²Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΡΠΈΠΏΠ° BlockingCollection<T>. ΠΡΠ»ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ boundedCapaci ty, ΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ boundedCapaci ty Π½Π΅ ΡΠΊΠ°Π·Π°Π½, ΡΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ.
ΠΠΎΠΌΠΈΠΌΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² TryAdd () ΠΈ TryTake (), ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Ρ ΡΠ΅ΠΌΠΈ, ΡΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ IProducerConsumerCollection<T>, Π² ΠΊΠ»Π°ΡΡΠ΅ BlockingCollection<T> ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ΄ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². ΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π΄Π°Π»Π΅Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ .
public void Add(T item) public T Take()
ΠΠΎΠ³Π΄Π° ΠΌΠ΅ΡΠΎΠ΄ Add () Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ, ΠΎΠ½ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ item Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅ΡΠΎΠ΄ Add () Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ, ΠΎΠ½ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½Π΅ΠΉ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ Π±ΠΎΠ»ΡΡΠ΅, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ item Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΠ΅ΡΠΎΠ΄ Π’Π°ΠΊΠ΅ () ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. (ΠΠΌΠ΅ΡΡΡΡ ΡΠ°ΠΊΠΆΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΎΠ±ΠΎΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΏΡΠΈΠ·Π½Π°ΠΊ Π·Π°Π΄Π°ΡΠΈ ΠΊΠ°ΠΊ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° CancellationToken.)
ΠΡΠΈΠΌΠ΅Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Add () ΠΈ Π’Π°ΠΊΠ΅(), ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½ "ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ", ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊ, ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΎΡ Π Π΄ΠΎ Z, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΡΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Ρ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΡΠΈΠΏΠ° BlockingCollection<T>, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½Π°Ρ 4 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ.
// ΠΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΡΠΈΠΏΠ° BlockingCollection. using System;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
class BlockingDemo {
static BlockingCollection<char> be;
// ΠΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΎΡ Π Π΄ΠΎ Z. static void Producer () {
for(char ch = 'A'; ch <= 'Z'; ch++) { be.Add(ch);
Console.WriteLine ("ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ» " + ch) ;
}
}
// ΠΠΎΡΡΠ΅Π±ΠΈΡΡ 26 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², static void Consumer() {
for(int i=0; i < 26; i++)
Console .WriteLine ("ΠΠΎΡΡΠ΅Π±Π»ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ» " + bc.TakeO);
}
static void Main() {
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ 4 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, be = new BlockingCollection<char>(4);
// Π‘ΠΎΠ·Π΄Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.
Task Prod = new Task(Producer);
Task Con = new Task(Consumer);
// ΠΠ°ΠΏΡΡΡΠΈΡΡ Π·Π°Π΄Π°ΡΠΈ.
Con.Start ();
Prod:Start();
// ΠΠΆΠΈΠ΄Π°ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠ±Π΅ΠΈΡ Π·Π°Π΄Π°Ρ, try {
Task.WaitAll(Con, Prod);
} catch(AggregateException exc) {
Console.WriteLine (exc);
} finally {
Con.Dispose ();
Prod.Dispose (); be.Dispose();
}
}
}
ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΡΠΎ Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΡΠΌΠ΅ΡΠ°Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π²ΡΠ²ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ. ΠΡΡΠ°ΡΡΠΈ ΡΡΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π¬Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° 4 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, Π° ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π² Π½Π΅Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΡΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π΅Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π¬Ρ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ ΠΈ ΠΏΠΎΠ½Π°Π±Π»ΡΠ΄Π°ΠΉΡΠ΅ Π·Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ. Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅Π΄Π°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Ρ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΡΠ½Π΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠ΅ΠΉ ΡΠΈΠΏΠ° BlockingCollection<T> ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ CompleteAdding (). ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΠΎΡΠΌΠ° Π΅Π³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ.
public void CompleteAdding()
ΠΡΠ·ΠΎΠ² ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. ΠΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ IsAddingComplete ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΏΡΡΡΠ°, ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ IsCompleted ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true, ΠΈ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄Π° Π’Π°ΠΊΠ΅ () Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΡΠΎΡΠΌΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² IsAddingComplete ΠΈ IsCompleted.
public bool IsCompleted { get; } public bool IsAddingComplete { get; }
ΠΠΎΠ³Π΄Π° ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΡΠΈΠΏΠ° BlockingCollection<T> ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΡΡΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ false. Π ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° CompleteAdding () ΠΎΠ½ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠΉ Ρ ΡΠ΅Π»ΡΡ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° CompleteAdding (), ΡΠ²ΠΎΠΉΡΡΠ²Π° IsCompleted ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° TryTake ().
// ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² CompleteAdding(), TryTake() ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° IsCompleted. using System;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
class BlockingDemo {
static BlockingCollection<char> be;
// ΠΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΎΡ Π Π΄ΠΎ Z. static void Producer() {
for (char ch = 'A'; ch <= 'Z'; ch++) { be.Add(ch);
Console.WriteLine("ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ» " + ch);
}
be.CompleteAdding();
}
// ΠΠΎΡΡΠ΅Π±Π»ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊ.
static void Consumer() {
char ch;
while(!be.IsCompleted) { if(be.TryTake(out ch))
Console.WriteLine("ΠΠΎΡΡΠ΅Π±Π»ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ» " + ch);
}
}
static void Main() {
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ 4 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, be = new BlockingCollection<char>(4);
// Π‘ΠΎΠ·Π΄Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.
Task Prod = new Task(Producer);
Task Con = new Task(Consumer);
// ΠΠ°ΠΏΡΡΡΠΈΡΡ Π·Π°Π΄Π°ΡΠΈ.
Con.Start();
Prod.Start();
// ΠΠΆΠΈΠ΄Π°ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠ±Π΅ΠΈΡ Π·Π°Π΄Π°Ρ, try {
Task.WaitAll(Con, Prod);
} catch(AggregateException exc) {
Console.WriteLine (exc);
} finally {
Con.Dispose();
Prod.Dispose(); be.Dispose();
}
}
}
ΠΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π°Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΊΠ°ΠΊ ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ. ΠΠ»Π°Π²Π½ΠΎΠ΅ Π΅Π³ΠΎ ΠΎΡΠ»ΠΈΡΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Producer () ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΈ ΠΏΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Π‘ ΡΡΠΎΠΉ ΡΠ΅Π»ΡΡ ΠΎΠ½ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ CompleteAdding (), ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Π ΠΌΠ΅ΡΠΎΠ΄ Consumer () Π»ΠΈΡΡ "ΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅Ρ" ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ IsCompleted Π½Π΅ ΠΏΡΠΈΠΌΠ΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true.