public static Task DisconnectTaskAsync(this BandClientManager manager, BandClient client)
        {
            // short circuit becuase if we are already disconnected
            // then the delegate won't get fired
            if (!client.IsConnected)
            {
                return(Task.FromResult <object> (null));
            }

            var tcs = new TaskCompletionSource <object> ();

            EventHandler <ClientManagerDisconnectedEventArgs>    onDisconnect = null;
            EventHandler <ClientManagerFailedToConnectEventArgs> onFailed     = null;

            // setup the disconnected event
            onDisconnect = (sender, args) => {
                if (args.Client == client)
                {
                    manager.Disconnected     -= onDisconnect;
                    manager.ConnectionFailed -= onFailed;

                    // we were disconnected (success)
                    tcs.SetResult(null);
                }
            };
            manager.Disconnected += onDisconnect;

            // setup the failed event
            onFailed = (sender, args) => {
                if (args.Client == client)
                {
                    manager.Disconnected     -= onDisconnect;
                    manager.ConnectionFailed -= onFailed;

                    // we failed
                    tcs.SetException(new BandException(args.Error));
                }
            };
            manager.ConnectionFailed += onFailed;

            // run async
            manager.DisconnectAsync(client);

            return(tcs.Task);
        }
        public static Task DisconnectTaskAsync(this BandClientManager manager, BandClient client)
        {
            var tcs = new TaskCompletionSource <object> ();

            EventHandler <ClientManagerDisconnectedEventArgs>    onDisconnect = null;
            EventHandler <ClientManagerFailedToConnectEventArgs> onFailed     = null;

            // setup the disconnected event
            onDisconnect = (sender, args) => {
                if (args.Client == client)
                {
                    manager.Disconnected     -= onDisconnect;
                    manager.ConnectionFailed -= onFailed;

                    // we were disconnected (success)
                    tcs.SetResult(null);
                }
            };
            manager.Disconnected += onDisconnect;

            // setup the failed event
            onFailed = (sender, args) => {
                if (args.Client == client)
                {
                    manager.Disconnected     -= onDisconnect;
                    manager.ConnectionFailed -= onFailed;

                    // we failed
                    tcs.SetException(new BandException(args.Error));
                }
            };
            manager.ConnectionFailed += onFailed;

            // run async
            manager.DisconnectAsync(client);

            return(tcs.Task);
        }