This introduces a race whereby the tasks queued during the initial state are now running during the creation of the new queue, potentially meaning sends that occur after Open could go through BEFORE sends that were queued during initialize. You'll need to modify DrainQueue to return a task that doesn't complete until the initialize TCS has finished (and the existing TCS too). This will satisfy the case when queuing is enabled, but the default is disabled, so you'll actually want to somehow prevent "over" queuing of sends after the initial queuing phase when queuing is disabled.