@ExperimentalCoroutinesApi suspend fun <E : Any> ReceiveChannel<E>.receiveOrNull(): E? (source)

Retrieves and removes the element from this channel suspending the caller while this channel isEmpty or returns null if the channel is closed.

This suspending function is cancellable. If the Job of the current coroutine is cancelled or completed while this function is suspended, this function immediately resumes with CancellationException.

Cancellation of suspended receive is atomic – when this function throws CancellationException it means that the element was not retrieved from this channel. As a side-effect of atomic cancellation, a thread-bound coroutine (to some UI thread, for example) may continue to execute even after it was cancelled from the same thread in the case when this receive operation was already resumed and the continuation was posted for execution to the thread’s queue.

Note, that this function does not check for cancellation when it is not suspended. Use yield or CoroutineScope.isActive to periodically check for cancellation in tight loops if needed.

This extension is defined only for channels on non-null types, so that generic functions defined using these extensions do not accidentally confuse null value and a normally closed channel, leading to hard to find bugs.