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(); }