Exemple #1
0
 protected TransformBlock(bool ensureOrdered = false, int maxDegreeOfParallelism = 1)
 {
     _transformBlock = new System.Threading.Tasks.Dataflow.TransformBlock <TInput, TOutput>(
         input => Transform(input),
         new ExecutionDataflowBlockOptions
     {
         EnsureOrdered          = ensureOrdered,
         MaxDegreeOfParallelism = maxDegreeOfParallelism
     }
         );
 }
        /// <summary>
        /// Retrieve all data via dataflow(TPL) with all core of processor
        /// </summary>
        /// <returns></returns>
        private async Task retrieveDatabase()
        {
            var executionOption = new ExecutionDataflowBlockOptions()
            {
                MaxDegreeOfParallelism = Environment.ProcessorCount, EnsureOrdered = false
            };
            //Download body database ISP DB
            var downloadHTML = new System.Threading.Tasks.Dataflow.TransformBlock <string, string>(s =>
            {
                using (DownloaderHtml downloader = new DownloaderHtml(Global.URL_ISPDB))
                {
                    return(downloader.Get().Result);
                    // return Regex.Matches(htmlDocument, "alt=\"\\[TXT\\]\"></td><td><a href=\"(.*)\">(.*)</a>");
                }
            }, executionOption);
            //Find links for parsing from DB
            var findLinks = new TransformManyBlock <string, string>(htmlDocument =>
            {
                var urls = new List <string>();
                foreach (Match math in Regex.Matches(htmlDocument, "alt=\"\\[TXT\\]\"></td><td><a href=\"(.*)\">(.*)</a>"))
                {
                    urls.Add(string.Concat(Global.URL_ISPDB, math.Groups[2].Value));
                }
                configs = new List <clientConfig>();
                return(urls);
            }, executionOption);

            //Parsing configs from DB link by link
            var downloadClientConfig = new ActionBlock <string>(url =>
            {
                using (DownloaderHtml downloader = new DownloaderHtml(url))
                {
                    string response = downloader.Get().Result;
                    var config      = ClientConfigDeserializer.Deserialize(response);
                    if (config == null)
                    {
                        return;
                    }
                    configs.Add(config);
                }
            }, executionOption);
            var linkOptions = new DataflowLinkOptions {
                PropagateCompletion = true
            };

            //Link all blocks
            downloadHTML.LinkTo(findLinks, linkOptions);
            findLinks.LinkTo(downloadClientConfig, linkOptions);

            //Post base URL for ISP DB
            downloadHTML.Post(_link);
            //Wait completion dataflow...
            await downloadHTML.Completion;
        }