Выход из приложения BrowserFetcher с использованием await

Я использую 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 ответ

Решение

Ваш основной метод не ожидает результата вашего асинхронного вызова. Основной метод выхода, закрытие приложения. Чтобы это исправить, нужно дождаться завершения асинхронного метода.

Если вы используете 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);
    }
}
Другие вопросы по тегам