/// <remarks/>
 public void doSearchAsync(string sessionhandle, SearchOptType searchquery, object userState)
 {
     if ((this.doSearchOperationCompleted == null)) {
         this.doSearchOperationCompleted = new System.Threading.SendOrPostCallback(this.OndoSearchOperationCompleted);
     }
     this.InvokeAsync("doSearch", new object[] {
                 sessionhandle,
                 searchquery}, this.doSearchOperationCompleted, userState);
 }
 /// <remarks/>
 public System.IAsyncResult BegindoSearch(string sessionhandle, SearchOptType searchquery, System.AsyncCallback callback, object asyncState)
 {
     return this.BeginInvoke("doSearch", new object[] {
                 sessionhandle,
                 searchquery}, callback, asyncState);
 }
 /// <remarks/>
 public void doSearchAsync(string sessionhandle, SearchOptType searchquery)
 {
     this.doSearchAsync(sessionhandle, searchquery, null);
 }
        /// <summary>
        /// Wyszukiwanie
        /// </summary>
        /// <param name="searchQuery">Szukane słowa</param>
        /// <param name="category">Kategoria, w której będzie wykonywane przeszukiwanie</param>
        /// <param name="price">Szukana cena</param>
        public List<SearchResponseType> Search(string searchQuery, string category, decimal price)
        {
            //TODO: check connection open state (on every search)
            //TODO: check session key (or refresh it by default, by every 30 minutes)
            if (_asvc.State != CommunicationState.Opened) _asvc.Open();

            //może być, że więcej kategorii spełnia wymogi wyszukiwania
            //dlatego niżej jest wprowadzone wyszukiwanie dla większej ilości
            //przeszukiwanych kategorii
            var foundCategories = _categories.Where(x => ReplacePolishChars(x.catname.ToLower()).Contains(ReplacePolishChars(category.ToLower())));

            var foundAuctions = new List<SearchResponseType>();

            foreach (var foundCategory in foundCategories)
            {
                for (var i = 0; i < 50; i++)	//doSearch zwraca tylko i wyłącznie 50 pierwszych wyników, przypuszczamy, że
                                                //maksymalnie będzie 50 "stron" zwracanych
                {
                    SearchResponseType[] tempFoundAuctions;

                    var allegroSearchQuery = new SearchOptType
                                             	{
                                             		searchcategory = foundCategory.catid,
                                             		searchstring = searchQuery,
                                             		searchpriceto = (float) price,
                                             		searchoffset = i,
                                                    searchlimit = 100,	//maksymalna ilość pobieranych danych (od 0 do 100)
                                                    searchorder = 4,	//sortowanie wyniku po cenie przedmiotu
                                                    searchordertype = 0	//sortowanie rosnąco (domyślnie, ale wolę wprowadzić)
                                             	};

                    var countFoundAuctions = _asvc.doSearch(out _tempCountFeaturedAuctions, out tempFoundAuctions,
                                                            out _tempExcludedWords, _sessionKey, allegroSearchQuery);

                    foundAuctions.AddRange(tempFoundAuctions);

                    if (countFoundAuctions < 50)	//jeżeli aukcji będzie mniej niż 50, przerywa działanie
                    {
                        break;
                    }
                }

                Thread.Sleep(new Random().Next(100, 600));	//usypianie wyszukiwania (w celu uniknięcia blokady)
            }

            return foundAuctions;
        }