首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BrowserFetcher退出应用程序使用等待

BrowserFetcher退出应用程序使用等待
EN

Stack Overflow用户
提问于 2018-07-26 12:24:02
回答 1查看 1.7K关注 0票数 0

我使用Puppeteer-Sharp下载站点的html,我创建了一个名为GetHtml的方法,它返回包含站点内容的字符串。问题是当我调用行await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);

应用程序退出时没有任何错误,这是我的代码:

代码语言:javascript
复制
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的代码。

代码语言:javascript
复制
    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();
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 12:31:51

您的主方法不等待异步调用的结果。主方法退出,关闭应用程序。要修复它,您需要等待异步方法完成。

如果使用的是C# 7.1或更高版本,则可以使用异步Main:

代码语言:javascript
复制
public class Program
{
    public static async void Main()
    {
        await TestAsync();
    }

    private static async Task TestAsync() 
    {
        await Task.Delay(5000);
    }
}

否则,您需要同步等待:

代码语言:javascript
复制
public class Program
{
    public static void Main()
    {
        TestAsync().GetAwaiter().GetResult();
    }

    private static async Task TestAsync() 
    {
        await Task.Delay(5000);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51538808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档