public IAsyncResult BeginFindServers(
            string endpointUrl,
            string endpointTransportProfileUri,
            string actualEndpointUrl,
            IList <string> preferredLocales,
            IList <string> serverUris,
            AsyncCallback callback,
            object callbackData)
        {
            DiscoveryClient client = CreateClient(endpointUrl, endpointTransportProfileUri);

            FindServersData data = new FindServersData(callback, callbackData, client.OperationTimeout)
            {
                DiscoveryClient = client
            };

            data.InnerResult = client.BeginFindServers(
                null,
                (actualEndpointUrl) ?? endpointUrl,
                new StringCollection((preferredLocales) ?? PreferredLocales),
                (serverUris != null) ? new StringCollection(serverUris) : null,
                OnFindServersComplete,
                data);

            return(data);
        }
        private void OnFindServersComplete(IAsyncResult result)
        {
            FindServersData data = result.AsyncState as FindServersData;

            try
            {
                ApplicationDescriptionCollection servers = null;
                data.DiscoveryClient.EndFindServers(result, out servers);

                data.Servers = servers;
                data.OperationCompleted();
            }
            catch (Exception e)
            {
                data.Exception = e;
                data.OperationCompleted();
            }
        }
        public List <ApplicationDescription> EndFindServers(IAsyncResult result)
        {
            FindServersData data = result as FindServersData;

            if (data == null)
            {
                throw new ArgumentException("Did not pass the correct IAsyncResult to end method.", "success");
            }

            try
            {
                if (!data.WaitForComplete())
                {
                    throw new TimeoutException();
                }

                return(data.Servers);
            }
            finally
            {
                data.DiscoveryClient.Close();
            }
        }