如何在没有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库的情况下调用anglesharp异步方法

在没有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等)等待工作完成。