C # 콘솔 응용 프로그램 코드가 기다린 후에 실행되지 않습니다.

async-await c# html-agility-pack html-parsing

문제

나는 html 파일에서 css / js / images에 대한 모든 다운로드 링크를 얻을 수있는 웹 스캐너를 만들려고합니다.

문제

첫 번째 중단 점은 성공하지만 두 번째 중단 점은 "계속"을 클릭 한 후에 발생하지 않습니다.

Visual Studio의 그림

코드 :

  private static async void GetHtml(string url, string downloadDir)
    {

        //Get html data, create and load htmldocument 
        HttpClient httpClient = new HttpClient();

        //This code gets executed
        var html = await httpClient.GetStringAsync(url);

        //This code not
        Console.ReadLine();
        var htmlDocument = new HtmlDocument();
        htmlDocument.LoadHtml(html);

        //Get all css download urls
        var linkUrl = htmlDocument.DocumentNode.Descendants("link")
            .Where(node => node.GetAttributeValue("type", "")
            .Equals("text/css"))
            .Select(node=>node.GetAttributeValue("href",""))
            .ToList();

        //Downloading css, js, images and source code
        using (var client = new WebClient())
        {
            for (var i = 0; i <scriptUrl.Count; i++)
            {

                    Uri uri = new Uri(scriptUrl[i]);
                    client.DownloadFile(uri,
                    downloadDir + @"\js\" + uri.Segments.Last());

            }
        }

편집하다

임 여기에서 getHtml 메서드를 호출 :

    private static void Start()
    {
        //Create a list that will hold the names of all the subpages
        List<string> subpagesList = new List<string>();

        //Ask user for url and asign that to var url, also add the url to the url list
        Console.WriteLine("Geef url van de website:");
        string url = "https://www.hethwc.nl";


        //Ask user for download directory and assign that to var downloadDir
        Console.WriteLine("Geef locatie voor download:");
        var downloadDir = @"C:\Users\Daniel\Google Drive\Almere\C# II\Download tests\hethwc\";

        //Download and save the index file
        var htmlSource = new System.Net.WebClient().DownloadString(url);
        System.IO.File.WriteAllText(@"C:\Users\Daniel\Google Drive\Almere\C# II\Download tests\hethwc\index.html", htmlSource);

        // Creating directories 
        string jsDirectory = System.IO.Path.Combine(downloadDir, "js");
        string cssDirectory = System.IO.Path.Combine(downloadDir, "css");
        string imagesDirectory = System.IO.Path.Combine(downloadDir, "images");

        System.IO.Directory.CreateDirectory(jsDirectory);
        System.IO.Directory.CreateDirectory(cssDirectory);
        System.IO.Directory.CreateDirectory(imagesDirectory);

        GetHtml("https://www.hethwc.nu", downloadDir);
    }

전문가 답변

GetHtml 은 어떻게 GetHtml 합니까? 아마도 Main 동기화) Main 메서드에서 왔고 다른 비 작업자 스레드는 실행 중이 아니기 때문에 (메인 스레드가 종료되었으므로) 프로세스가 종료됩니다. 같은 것 :

static void Main() {
    GetHtml();
}

위의 코드는 GetHtml 반환되고 Main 메서드가 끝난 직후에 프로세스를 종료합니다.이 메서드는 첫 번째 불완전 await 지점에 있습니다.

현재 C # 버전 (C # 7.1 이후)에서는 Task 을 반환하도록 GetHtml 을 변경하는 한 async Task Main() 메서드를 만들어 GetHtml 메서드를 제대로 awaitawait .

async static Task Main() {
    await GetHtml();
}


Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow