簡體   English   中英

如何在事件中調用方法,反之亦然 C#

[英]How can I call method in Event and vice versa C#

我有兩個班級,每個 class 都有自己的事件。 第一個 class 有兩個事件:

public class Crawler
    {
        public event EventHandler CrawlingComplete;
        public event EventHandler NextPage;


        protected virtual void OnCrawlingComplete(EventArgs e)
        {
            CrawlingComplete?.Invoke(this,e);
        }
        protected virtual void OnNextPage(EventArgs e)
        {
            NextPage?.Invoke(this,e);
        }
     


        public IWebDriver Driver { get; set; }

        public By NextButton { get; set; }

        public virtual void Start()
        {
        
            var nextButton= Driver.FindElement(NextButton);
            if (nextButton!=null&&nextButton.Enabled&&nextButton.Displayed )
            {
                nextButton.Click();

                OnNextPage(EventArgs.Empty);
            }
            else
            {
                OnCrawlingComplete(EventArgs.Empty);
            }
            
        }
    }

第二個 class 有一個事件:

public class Scraper
    {
        public event EventHandler ScrapingComplete;

        protected virtual void OnScrapingComplete(EventArgs e)
        {
            ScrapingComplete?.Invoke(this, e);
        }


        public IWebDriver Driver { get; set; }
        public By Element { get; set; }
        private List<string> Result { get; set; } = new List<string>();
        public void Start()
        {
            var findElements = Driver.FindElements(Element);

            foreach (var findElement in findElements)
            {
                if (findElement != null && findElement.Displayed && findElement.Enabled)
                {
                    Result.Add(findElement.Text);
                }
            }
            OnScrapingComplete(EventArgs.Empty);
        }

        private void SaveToFile()
        {
            System.IO.File.AppendAllLines(@"L:\ebooks\asdad.txt",Result);
        }
    }

最后在第三個 class 中將這些類組合在一起:

public class Spider
    {
        public IWebDriver Driver { get; set; }

        public Crawler _crawler;
        public Scraper _scraper;
        public void SetUrl(string url)
        {
            Driver.Navigate().GoToUrl(url);
            Driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(3000);

        }

        public void SetSpider(Crawler crawler, Scraper scraper)
        {
            _crawler = crawler;
            _scraper = scraper;

            _scraper.Driver = Driver;
            _crawler.Driver = Driver;
        }

        public void Start()
        {
            Scraping();
        }

        private void Crawling()
        {
            _crawler.NextButton = By.CssSelector("a.nextpostslink");
            _crawler.Start();
            _crawler.NextPage += _crawler_NextPage;
        }

    

        private void Scraping()
        {
            _scraper.Element = By.CssSelector("div.wp-post-details-img > div > a > h2");
            _scraper.Start();
            _scraper.ScrapingComplete += Scraper_ScrapingComplete;
        }

        private void _crawler_NextPage(object sender, EventArgs e)
        {
            Console.ForegroundColor=ConsoleColor.DarkYellow;
            Console.WriteLine("crawler event fired!");
            Scraping();
        }

        private void Scraper_ScrapingComplete(object sender, EventArgs e)
        {
            Console.ForegroundColor=ConsoleColor.Magenta;
            Console.WriteLine("scraper event fired!");
            Crawling();
        }
    }

第三個在 Program.cs 中使用:

class Program
    {
        static void Main(string[] args)
        {
            Console.ForegroundColor=ConsoleColor.DarkYellow;
            Console.WriteLine(" fired!");

            Spider spider = new Spider();
            spider.Driver = new ChromeDriver();

            //persian script crawler
            Crawler psCrawler = new Crawler {NextButton = By.CssSelector("a.nextpostslink")};

            //persian script Scraper
            Scraper psScraper = new Scraper {Element = By.CssSelector("div.wp-post-details-img > div > a > h2")};


            spider.SetUrl("https://www.persianscript.ir/");
            spider.SetSpider(psCrawler,psScraper);
            spider.Start();


            Console.ReadKey();
        }
    }

正如您在 Spider 類中看到的那樣,我將爬蟲的事件稱為爬蟲,而對於爬蟲的事件則稱為爬蟲。 原因首先運行抓取方法然后運行抓取方法(用於逐頁抓取和抓取 - 事件循環)

但事件不會引發。 我不知道為什么。

至少在這兩個地方你應該在開始工作之前訂閱

    private void Crawling()
    {
        _scraper.ScrapingComplete += Scraper_ScrapingComplete;
        _crawler.NextPage += _crawler_NextPage;
        _crawler.Start();
    }

    private void Scraping()
    {
        _scraper.ScrapingComplete += Scraper_ScrapingComplete;
        _scraper.Start();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM