コード例 #1
0
        public SearchResultModel GetSearchResultAsync(string keyword, bool english, SearchResultModel result)
        {
            Task.Run(() =>
            {
                Parallel.ForEach(this.engines, engine =>
                {
                    base.SearchOnEngine(engine, keyword, english, result);
                });

                result.Finished = true;
            });

            SpinWait.SpinUntil(() => result.Searched > 0 || result.Finished);

            SearchResultModel newResult = null;

            try
            {
                lock (result)
                {
                    newResult = result.Copy();
                }
            }
            catch (Exception e)
            {
                Log.Error(e, "catched an exception when copying result.");
            }
            return(newResult);
        }
コード例 #2
0
ファイル: CustomSearcher.cs プロジェクト: venyowong/hotoke
        public SearchResultModel GetSearchResult(string keyword)
        {
            if (string.IsNullOrWhiteSpace(keyword))
            {
                return(null);
            }
            if (this.cache.TryGetValue(keyword, out SearchResultModel result))
            {
                return(result);
            }

            var requestId = Guid.NewGuid().ToString();

            result = new SearchResultModel
            {
                RequestId = requestId
            };
            cache.Set(requestId, result, _expirationTime);
            this.cache.Set(keyword, result, _expirationTime);
            var english = !keyword.HasOtherLetter();

            result.Results = new List <SearchResult>();

            Parallel.ForEach(this.firstEngines, engine =>
            {
                base.SearchOnEngine(engine, keyword, english, result);
            });
            Task.Run(() =>
            {
                Parallel.ForEach(this.secondaryEngines, engine =>
                {
                    base.SearchOnEngine(engine, keyword, english, result);
                });

                result.Finished = true;
            });

            SpinWait.SpinUntil(() => result.Searched > 0 || result.Finished);

            SearchResultModel newResult = null;

            try
            {
                lock (result)
                {
                    newResult = result.Copy();
                }
            }
            catch (Exception e)
            {
                Log.Error(e, "catched an exception when copying result.");
            }
            return(newResult);
        }
コード例 #3
0
        public SearchResultModel GetSearchResult(string keyword)
        {
            if (string.IsNullOrWhiteSpace(keyword))
            {
                return(null);
            }

            var requestId = Guid.NewGuid().ToString();
            var result    = new SearchResultModel
            {
                RequestId = requestId
            };

            cache.Set(requestId, result, new TimeSpan(0, 1, 0));
            var english = !keyword.HasOtherLetter();

            result.Results = new List <SearchResult>();

            var logger = NiologManager.CreateLogger();

            Task.Run(() =>
            {
                NiologManager.Logger = logger;
                Parallel.ForEach(engines, engine =>
                {
                    NiologManager.Logger = logger;
                    SearchPerEngine(engine, keyword, english, result);
                });

                result.Finished = true;
            });

            SpinWait.SpinUntil(() => result.Searched > 0 || result.Finished);

            SearchResultModel newResult = null;

            try
            {
                lock (result)
                {
                    newResult = result.Copy();
                }
            }
            catch (Exception e)
            {
                logger.Error()
                .Message("catched an exception when copying result.")
                .Exception(e, true)
                .Write();
            }
            return(newResult);
        }