[英]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.