Dispatches execution of a runnable block onto another thread in the given context. This method should guarantee that the given block will be eventually invoked, otherwise the system may reach a deadlock state and never leave it. Cancellation mechanism is transparent for CoroutineDispatcher and is managed by block internals.
This method should generally be exception-safe. An exception thrown from this method may leave the coroutines that use this dispatcher in the inconsistent and hard to debug state.
This method must not immediately call block. Doing so would result in StackOverflowError
when yield is repeatedly called from a loop. However, an implementation that returns
isDispatchNeeded can delegate this function to
dispatch method of Dispatchers.Unconfined, which is
integrated with yield to avoid this problem.