public async Task WritingNotifiesCallbackWhenHostHasClosed()
        {
            var wroteMessage = new TaskCompletionSource <Unit>();
            var hostClosed   = new AutoResetEvent(false);
            var exception    = new TaskCompletionSource <Exception>();
            var disposed     = false;
            var hostTask     = Pipe.Host(_pipeName);
            var task         = Task.Run(() =>
            {
                using (_pipeName.BeginWritingMessages("name", e => exception.SetResult(e), Observable.Create <IBinaryMessage>(obs =>
                {
                    obs.OnNext(IntMessage.Compose(42));
                    wroteMessage.SetResult(Unit.Default);
                    hostClosed.WaitOne();
                    obs.OnNext(IntMessage.Compose(43));
                    return(Disposable.Create(() => disposed = true));
                }))){}
            });
            var host = await hostTask;
            await wroteMessage.Task;

            using (var reader = new BinaryReader(host))
            {
                var msg = IntMessage.TryParse(BinaryMessage.ReadFrom(reader));
                Assert.AreEqual(42, msg.Value);
            }
            Assert.IsFalse(exception.Task.IsCompleted);
            host.Close();
            hostClosed.Set();
            await task;

            Assert.IsNotNull(await exception.Task);
            Assert.IsTrue(disposed);
        }