简体   繁体   English

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

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

I have two classes each class has events for self.我有两个班级,每个 class 都有自己的事件。 first class has two events:第一个 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);
            }
            
        }
    }

and second class has one event:第二个 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);
        }
    }

in finally combined these classes together in third class:最后在第三个 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();
        }
    }

and third used in Program.cs:第三个在 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();
        }
    }

As you can see in the Spider classm i called crawler's event that call scrape and for scraper's event call crawler.正如您在 Spider 类中看到的那样,我将爬虫的事件称为爬虫,而对于爬虫的事件则称为爬虫。 for reason first run scraping method then run crawling method (for crawling and scraping one by one pages - event loop)原因首先运行抓取方法然后运行抓取方法(用于逐页抓取和抓取 - 事件循环)

but events do not raise.但事件不会引发。 i dont know why.我不知道为什么。

at least in this two place there you should subscribe before start to work至少在这两个地方你应该在开始工作之前订阅

    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.

相关问题 如何在c#中将Xml转换为Json,反之亦然 - How can I convert Xml to Json and vice versa in c# 如何在C#中将位图转换为一维字节数组,反之亦然? - How can I convert a Bitmap to a 1D byte array and vice versa in C#? Google Event DateTime到System DateTime,反之亦然C# - Google Event DateTime to System DateTime & vice versa C# C#如何将以下表示形式的excel单元格地址转换为“ LetterNumber”到“ Number,Number”,反之亦然? - C# How can I convert an excel cells address in the following notation: “LetterNumber” to “Number, Number” and vice-versa? PHP到C#,反之亦然 - PHP to C# and Vice versa 我可以在C#中的另一个方法调用事件上触发一个方法吗? - Can I trigger a method on another method call event in C#? 我将如何在C#中实现Java代码,反之亦然? - How would I go about implementing java code in c# and vice versa? Java 或 C# 十六进制/十进制转换,反之亦然,如何最好? - Java or C# sexagesimal/decimal conversion and vice versa, How is best? 如何将C#类型转换为IronRuby类型,反之亦然? - How to convert C# types to IronRuby types and vice versa? 在C#中将像素转换为英寸,反之亦然 - Convert Pixels to Inches and vice versa in C#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM