如何在没有AsyncEx库的情况下调用anglesharp异步方法
本文关键字:情况下 调用 anglesharp 异步方法 AsyncEx | 更新日期: 2023-09-27 18:27:16
使用AngleSharp,要加载HTML页面并等待所有样式表下载(如果需要),并且所有脚本都准备好执行解析器,我会执行这个
public sealed class WebReader
{
private IDocument _ashDocument;
public async Task Load(string Url)
{
var config = Configuration.Default.WithDefaultLoader().WithJavaScript().WithCss();
var context = BrowsingContext.New(config);
_ashDocument = await context.OpenAsync(Url);
}
public IEnumerable<string> getImage()
{
return _ashDocument.QuerySelectorAll("img").Select(n => n.Attributes["src"].Value);
}
}
static void Main(string[] args)
{
WebReader wReader = new WebReader();
AsyncContext.Run((Action)(async () =>
{
await wReader.Load("http://blogs.msdn.com/b/dotnet/");
}));
IEnumerable<string> imageUrls = wReader.getImage();
foreach (string url in imageUrls)
{
Console.WriteLine(url);
}
Console.ReadKey();
}
AsyncContext是AsyncEx库的一部分。
在没有AsyncEx库的情况下可以做同样的事情吗?
在没有AsyncEx库的情况下可以做同样的事情吗?
不在控制台应用程序内部。AsyncContext
的全部目的是允许您等待Main
中的一个方法,该方法本身不是异步的(也不可能是异步的)。唯一的选择是阻止该任务。此外,正如@StephanCleary所指出的,上下文中的延续将在单个线程上恢复,而不是在任意线程池线程上。
如果没有它,它将只是:
static void Main(string[] args)
{
WebReader wReader = new WebReader();
wReader.Load("http://blogs.msdn.com/b/dotnet/")).Wait();
IEnumerable<string> imageUrls = wReader.getImage();
foreach (string url in imageUrls)
{
Console.WriteLine(url);
}
}
在极少数情况下,用Task.Wait
阻断是可以的,这就是其中之一。
附带说明-异步方法应该用Async
后缀进行标记,因此应该使用LoadAsync
。另外,.NET方法命名约定是Pascal大小写,而不是camel大小写。
确实可以:
static void Main(string[] args)
{
DoWork();
Console.ReadKey();
}
static async void DoWork()
{
WebReader wReader = new WebReader();
await wReader.Load("http://blogs.msdn.com/b/dotnet/");
IEnumerable<string> imageUrls = wReader.getImage();
foreach (string url in imageUrls)
{
Console.WriteLine(url);
}
}
这将完全相同,唯一的区别是在DoWork下载数据时执行readkey,如果这种副作用不是不方便的,那么你就很好。
否则,您可以使用同步事件(ManualResetEvent、AutoResetEvent等)等待工作完成。