///<summary>
        /// Calls SearchExperiments on the server and waits for a response (synchronous).
        /// This should not be called on a UI thread
        ///</summary>
        public ExperimentSearchResult SearchExperiments(ExperimentSearchRequest searchRequest)
        {
            IAsyncResult result = BeginSearchExperiments(searchRequest, null, null);

            result.AsyncWaitHandle.WaitOne();

            return(EndSearchExperiments(result));
        }
        ///<summary>
        /// Returns the result of calling SearchExperiments on the server as an async Task.
        ///</summary>
        public Task <ExperimentSearchResult> SearchExperimentsAsync(ExperimentSearchRequest searchRequest)
        {
            var taskSource = new TaskCompletionSource <ExperimentSearchResult>();

            BeginSearchExperiments(searchRequest, asyncResult =>
            {
                try
                {
                    var result = EndSearchExperiments(asyncResult);
                    taskSource.SetResult(result);
                }
                catch (Exception exception)
                {
                    taskSource.SetException(exception);
                }
            }, null);
            return(taskSource.Task);
        }
 /// <summary>
 /// Returns a list of experiments that satisfy user criteria
 /// </summary>
 public IAsyncResult BeginSearchExperiments(ExperimentSearchRequest searchRequest, System.AsyncCallback callback, object asyncState)
 {
     return(base.Channel.BeginSearchExperiments(searchRequest, callback, asyncState));
 }