メソッドを非同期にする

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;
}

私は、HTMLソースをURLから取得するためにHtmlAgilityPackを使用します。

しかし、私がこのメソッドを使用すると、 フリーズ・プログラムが発生します。

私はUIでこのメソッドを呼び出すときに、私はマルチスレッドを使用することができます知っている 、私は、非同期&応答そのものであることを途中で私の方法を書きたいと我々はそれを使用する場合、それが凍結することなく動作します。

誰かが私のメソッドを使用していて、マルチスレッドがわからない場合、私は彼/彼女のプログラムをフリーズさせたくありません。言い換えれば、私のメソッドをスレッドやタスクで呼びたくはありません!

人気のある回答

通常は、正しい方法で使用だろうasyncあなたが使用しているIO法の同等物(のようなLoad()しかし、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は合法ですか? はい、理由を学ぶ