BrowserFetcher 使用 await 退出应用程序
BrowserFetcher exit application using await
我正在使用 Puppeteer-Sharp
下载网站的 html
,我创建了一个名为 GetHtml
的方法,其中 return 包含网站内容的字符串。问题是当我调用 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
行时
应用程序退出没有任何错误,这是我的代码:
public class Program
{
public static void Main(string[] args)
{
try
{
new FixtureController().AddUpdateFixtures();
}
catch (Exception ex)
{
new Logger().Error(ex);
}
}
}
public async Task AddFixtures()
{
int monthDays = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
var days = Enumerable.Range(1, monthDays).Select(x => x.ToString("D2")).ToArray();
HtmlDocument doc = new HtmlDocument(); //this is part of Htmlagilitypack library
foreach (var day in days)
{
//Generate url for this iteration
Uri url = new Uri("somesite/" + day);
var html = await NetworkHelper.GetHtml(url);
doc.LoadHtml(html);
}
}
所以每次 foreach 迭代都会生成一个 url 来下载数据,方法 GetHtml
应该 return html
但是应用程序退出(没有错误)当到达var html = ..
时,这是GetHtml
的代码:
public static async Task<string> GetHtml(Uri url)
{
try
{
//here the crash
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
}
catch (Exception e)
{
//No breakpoint point firing
}
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
using (Page page = await browser.NewPageAsync())
{
await page.GoToAsync(url.ToString());
return await page.GetContentAsync();
}
}
您的主要方法不等待异步调用的结果。 main 方法退出,关闭应用程序。要修复它,您需要等待异步方法完成。
如果您使用的是 C# 7.1 或更新版本,您可以使用 async Main:
public class Program
{
public static async void Main()
{
await TestAsync();
}
private static async Task TestAsync()
{
await Task.Delay(5000);
}
}
否则需要同步等待:
public class Program
{
public static void Main()
{
TestAsync().GetAwaiter().GetResult();
}
private static async Task TestAsync()
{
await Task.Delay(5000);
}
}
我正在使用 Puppeteer-Sharp
下载网站的 html
,我创建了一个名为 GetHtml
的方法,其中 return 包含网站内容的字符串。问题是当我调用 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
应用程序退出没有任何错误,这是我的代码:
public class Program
{
public static void Main(string[] args)
{
try
{
new FixtureController().AddUpdateFixtures();
}
catch (Exception ex)
{
new Logger().Error(ex);
}
}
}
public async Task AddFixtures()
{
int monthDays = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
var days = Enumerable.Range(1, monthDays).Select(x => x.ToString("D2")).ToArray();
HtmlDocument doc = new HtmlDocument(); //this is part of Htmlagilitypack library
foreach (var day in days)
{
//Generate url for this iteration
Uri url = new Uri("somesite/" + day);
var html = await NetworkHelper.GetHtml(url);
doc.LoadHtml(html);
}
}
所以每次 foreach 迭代都会生成一个 url 来下载数据,方法 GetHtml
应该 return html
但是应用程序退出(没有错误)当到达var html = ..
时,这是GetHtml
的代码:
public static async Task<string> GetHtml(Uri url)
{
try
{
//here the crash
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
}
catch (Exception e)
{
//No breakpoint point firing
}
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
using (Page page = await browser.NewPageAsync())
{
await page.GoToAsync(url.ToString());
return await page.GetContentAsync();
}
}
您的主要方法不等待异步调用的结果。 main 方法退出,关闭应用程序。要修复它,您需要等待异步方法完成。
如果您使用的是 C# 7.1 或更新版本,您可以使用 async Main:
public class Program
{
public static async void Main()
{
await TestAsync();
}
private static async Task TestAsync()
{
await Task.Delay(5000);
}
}
否则需要同步等待:
public class Program
{
public static void Main()
{
TestAsync().GetAwaiter().GetResult();
}
private static async Task TestAsync()
{
await Task.Delay(5000);
}
}