public static IAsyncResult BeginSearch <T>(GoogleSearchRequest request, int resultCount, AsyncCallback callback, object state)
        {
            var searchAsyncResult = new SearchAsyncResult <T>(state);

            RunSearch(searchAsyncResult, request, 0, resultCount, callback);

            return(searchAsyncResult);
        }
        private static void RunSearch <T>(SearchAsyncResult <T> searchAsyncResult, GoogleSearchRequest request, int start, int restCount, AsyncCallback callback)
        {
            if (restCount > 0)
            {
                var resultSize = restCount > 4 ? ResultSize.Large : ResultSize.Small;

                BeginGetResponseData(
                    request,
                    start,
                    resultSize,
                    ar =>
                {
                    try
                    {
                        ISearchData <T> searchData;
                        try
                        {
                            searchData = EndGetResponseData <T>(ar);
                        }
                        catch (GoogleServiceException ex)
                        {
                            if (ex.ResponseStatus == ResponseStatusConstant.OutOfRangeStatus)
                            {
                                FinishSearch(searchAsyncResult, callback);
                                return;
                            }

                            throw;
                        }

                        var count = Math.Min(searchData.Results.Length, restCount);

                        if (count == 0)
                        {
                            FinishSearch(searchAsyncResult, callback);
                        }
                        else
                        {
                            searchAsyncResult.Result.AddRange(searchData.Results.Take(count));

                            RunSearch(searchAsyncResult, request, start + count, restCount - count, callback);
                        }
                    }
                    catch (Exception ex)
                    {
                        searchAsyncResult.Exception = ex;
                        FinishSearch(searchAsyncResult, callback);
                    }
                },
                    null);
            }
            else
            {
                FinishSearch(searchAsyncResult, callback);
            }
        }
 private static void FinishSearch <T>(SearchAsyncResult <T> searchAsyncResult, AsyncCallback callback)
 {
     try
     {
         callback(searchAsyncResult);
     }
     finally
     {
         searchAsyncResult.Complete();
     }
 }