public void CloseGracefully()
        {
            using (var host = new ProtoHost<ServerService>(new IPEndPoint(IPAddress.Loopback, 0)))
            {
                using (new ClientService(host.LocalEndPoint))
                {
                    var stopwatch = new Stopwatch();

                    stopwatch.Start();
                    host.Close(CloseMode.Gracefully, TimeSpan.FromMilliseconds(100));
                    stopwatch.Stop();

                    Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, 90);
                }
            }
        }
        public void CloseWithAbort()
        {
            using (var host = new ProtoHost<ServerService>(new IPEndPoint(IPAddress.Loopback, 0)))
            {
                using (new ClientService(host.LocalEndPoint))
                {
                    var stopwatch = new Stopwatch();
                    stopwatch.Start();

                    host.Close(CloseMode.Abort);

                    stopwatch.Stop();

                    // Asserted time is not exact, but it will probably be less
                    // than this.

                    Assert.Less(stopwatch.ElapsedMilliseconds, 100);
                }
            }
        }
        public void GracefullCloseWithoutFullTimeout()
        {
            using (var host = new ProtoHost<ServerService>(new IPEndPoint(IPAddress.Loopback, 0)))
            {
                var stopwatch = new Stopwatch();

                var client = new ClientService(host.LocalEndPoint);

                ThreadPool.QueueUserWorkItem(p =>
                {
                    using (client)
                    {
                        Thread.Sleep(100);
                    }
                });

                stopwatch.Start();
                host.Close(CloseMode.Gracefully, TimeSpan.FromMilliseconds(500));
                stopwatch.Stop();

                Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, 90);
                Assert.LessOrEqual(stopwatch.ElapsedMilliseconds, 150);
            }
        }