메서드 자체를 비동기로 만듭니다.

async-await asynchronous c# html-agility-pack multithreading

문제

나는 다음과 같은 방법을 가지고있다.

public  List<List<string>>  GroupedNodes(string URL, params string[] XPathes)
{
    //Load HTML Source
    HtmlWeb loader = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = loader.Load(URL);

    //some other codes ...

    //Return result as a List of list
    return grouped;
}

나는 HtmlAgilityPack 을 사용하여 URL에서 HTML 소스를 얻는다.

그러나이 방법을 사용하면 프로그램이 중단 됩니다.

나는 UI에서이 메서드를 호출 할 때 나는 멀티 스레딩을 사용할 수 있습니다 알고 있지만 비동기 및 응답 자체가 될 수있는 방법 나의 방법을 쓰고 싶어하고 우리가 그것을 사용할 때, 그것은 동결없이 작동합니다.

내 방법을 사용하는 사람이 멀티 스레딩을 모른다면 그 / 그녀의 프로그램이 멈추지 않게하고 싶습니다. 즉, 스레드 나 태스크로 내 메서드를 호출하고 싶지는 않습니다.

인기 답변

일반적으로 올바른 방법은 사용중인 IO 메서드 ( Load() )와 동일한 async 동등 async 사용하는 것입니다. 그러나 HtmlAgilityPack은 비동기를 지원하지 않는 것 같습니다. (적어도 .Net 4.5 버전에서는 그렇지 않습니다.)

이것은 최선의 옵션은 다른 스레드에서 당신의 방법을 실행하고 사용하는 발신자를 요구하는 의미 async - await :

예를 들어 구현은 다음과 같습니다.

private List<List<string>> GroupedNodes(string URL, params string[] XPathes)
{
    //Load HTML Source
    HtmlWeb loader = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = loader.Load(URL);

    //some other codes ...

    //Return result as a List of list
    return grouped;
}

public Task<List<List<string>>> GroupedNodesAsync(string URL, params string[] XPathes)
{
    return Task.Run(() => GroupedNodes(URL, XPathes));
}

async - await 사용하지 않으면 메서드가 호출 스레드를 차단하지 못하게하는 좋은 방법이 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.