Summary
Provides a synchronized channel for communication between concurrent threads.
Generic type parameters
T |
The type of message exchanged between threads. |
Remarks
The design of this class is based on the concept of channels in the Go programming language:
-
The basic principle is to have one thread “write” (enqueue) items and another “read” (dequeue) them. The
writing thread can signal the end of the channel by closing it.
-
Any number of threads can write to a channel. However, a master thread must be responsible for closing the
channel; if nobody closes it, reads will block indefinitely, and if a thread attempts to write after
another thread closed the channel, an exception occurs.
-
Any number of threads can read from a channel. If no item is waiting in the queue, the reading thread
blocks until another thread either writes an item or closes the channel.
-
A closed channel can still be read from until all the enqueued elements are exhausted, at which point
reading from the closed channel throws. The Channel<T>.TryRead(out T) method can be used to avoid this
exception. Note that accessing Channel<T>.HasMore is not enough as another reading thread can dequeue
an item at any time.
-
The easiest way to read from a channel safely is to iterate over it using a
foreach
loop. Multiple
threads can use such a loop simultaneously; doing so will “spread” the items across the threads. The
foreach
loops all end when the channel is closed and all elements are
exhausted.
Constructors
| Creates a new instance of Channel<T>. |
Instance methods
void | |
Signals the end of the channel. Threads can still read elements waiting in the channel, but no further
elements can be written to it. |
IEnumerator<T> | |
Returns an enumerator that allows safe reading from this channel. Multiple threads can call this to iterate
over the channel; the items from the channel are spread across those threads. |
T | |
Reads an element from the channel. If no element is waiting to be read, blocks until an element is received or
the channel is closed. |
bool | |
Determines whether an element can be read from the channel and if so, reads it. If no element is waiting to be
read, blocks until an element is received or the channel is closed. |
void | |
Writes an element to the channel. |
Instance properties
bool | |
Determines whether the channel contains more items. |