为了账号安全,请及时绑定邮箱和手机立即绑定

BrowserFetcher 使用 await 退出应用程序

BrowserFetcher 使用 await 退出应用程序

C#
喵喵时光机 2021-10-31 19:29:36
我正在使用Puppeteer-Sharp下载html站点的 ,我创建了一个调用的方法,该方法GetHtml返回一个包含站点内容的字符串。问题是当我拨打电话时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应该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();        }    }
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您的 main 方法不会等待异步调用的结果。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);

    }

}


查看完整回答
反对 回复 2021-10-31
  • 1 回答
  • 0 关注
  • 284 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信