我有这样的方法:
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 从网址获取html源代码。
但是当我使用这种方法时,它会导致冻结程序。
我知道当我在UI中调用此方法时我可以使用多线程但是我想以某种方式编写我的方法异步&amp;响应自己,当我们使用它时,它可以毫无结果地工作。
我的意思是如果有人使用我的方法并且他/她不了解多线程,我希望他/她的程序不要冻结,换句话说,我不想用线程或任务调用我的方法!
答案 0 :(得分:1)
通常,正确的方法是使用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
,没有办法让你的方法不阻止调用线程。
答案 1 :(得分:0)
答案 2 :(得分:-2)
您似乎/不太了解任务和异步的概念。异步方法的诞生是因为 IO/网络绑定操作的性质,这可能需要一些时间来完成操作,您必须等到它完成。多年来,事件和回调用于解决这样的问题,而现在 async 和 await 很好地扮演了这个角色。 回到问题,当你在 UI 线程上同步运行一个异步任务时,你必须等待它完成,结果就是冻结,否则如果你不想冻结,你必须使用异步方法在 MVVM 架构中的 UI 调度程序或 ViewModel 上