Beispiel #1
0
        public UrlCrawler(Uri startUrl)
        {
            DispatcherHelper.Initialize();

            _urlStore = new ConcurrentDictionary<string, Uri>();
            _queue = new ConcurrentQueue<Uri>();
            _queue.Enqueue(startUrl);

            var urlDownloadHandlers = Enumerable.Range(0, 1000).Select(x => new UrlDownloadHandler()).ToArray();
            var urlCrawlHandlers = Enumerable.Range(0, 10).Select(x => new UrlCrawlHandler()).ToArray();
            var urlFinisherHandlers = Enumerable.Range(0, 10).Select(x => new UrlFinisherHandler(_urlStore, _queue, this)).ToArray();

            Disruptor = new Disruptor<UrlEntry>(() => new UrlEntry(), new MultiThreadedLowContentionClaimStrategy(RingSize), new BlockingWaitStrategy(), TaskScheduler.Default);
            Disruptor.HandleEventsWith(urlDownloadHandlers).AsSequenceBarrier();
            Disruptor.After(urlDownloadHandlers).HandleEventsWith(urlCrawlHandlers).AsSequenceBarrier();
            Disruptor.After(urlCrawlHandlers).HandleEventsWith(urlFinisherHandlers).AsSequenceBarrier();
        }