【问题标题】:Xilium CefGlue - How to get HTML source synchonously?Xilium CefGlue - 如何同步获取 HTML 源?
【发布时间】:2015-03-26 19:41:31
【问题描述】:

我想在 CEF3/Xilium CefGlue rom 非 UI 线程(屏幕外浏览器)中获取网页源代码

我这样做

internal class TestCefLoadHandler : CefLoadHandler
{
    protected override void OnLoadStart(CefBrowser browser, CefFrame frame)
    {
        // A single CefBrowser instance can handle multiple requests for a single URL if there are frames (i.e. <FRAME>, <IFRAME>).
        if (frame.IsMain)
        {
            Console.WriteLine("START: {0}", browser.GetMainFrame().Url);
        }
    }

    protected override void OnLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode)
    {
        if (frame.IsMain)
        {
            MyCefStringVisitor mcsv = new MyCefStringVisitor();
            frame.GetSource(mcsv);

            Console.WriteLine("END: {0}, {1}", browser.GetMainFrame().Url, httpStatusCode);
        }
    }
}

class MyCefStringVisitor : CefStringVisitor
{
    private string html;

    protected override void Visit(string value)
    {
        html = value;
    }
    public string Html
    {
        get { return html; }
        set { html = value; }
    }
}

但是调用了

GetSource(...)
是异步的,所以我需要等待调用发生,然后再尝试对结果执行任何操作。

如何等待通话发生?

【问题讨论】:

  • GetSource(),它是无效的方法而不是任务。我不能等待 GetSource(...)

标签: c# chromium-embedded cefglue


【解决方案1】:

根据 Alex Maitland 的提示告诉我,我可以调整 CefSharp 实现 (https://github.com/cefsharp/CefSharp/blob/master/CefSharp/TaskStringVisitor.cs) 来做类似的事情。

我这样做:

    protected override async void OnLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode)
    {
        if (frame.IsMain)
        {
            // MAIN CALL TAKES PLACE HERE
            string HTMLsource = await browser.GetSourceAsync();
            Console.WriteLine("END: {0}, {1}", browser.GetMainFrame().Url, httpStatusCode);
        }
    }


public class TaskStringVisitor : CefStringVisitor
{
    private readonly TaskCompletionSource<string> taskCompletionSource;

    public TaskStringVisitor()
    {
        taskCompletionSource = new TaskCompletionSource<string>();
    }

    protected override void Visit(string value)
    {
        taskCompletionSource.SetResult(value);
    }

    public Task<string> Task
    {
        get { return taskCompletionSource.Task; }
    }
}

public static class CEFExtensions
{
    public static Task<string> GetSourceAsync(this CefBrowser browser)
    {
        TaskStringVisitor taskStringVisitor = new TaskStringVisitor();
        browser.GetMainFrame().GetSource(taskStringVisitor);
        return taskStringVisitor.Task;
    }
}  

【讨论】:

  • 你用HTMLSource做什么?有没有办法将它从回调方法中分离出来以便您可以使用它?也许将其分配给公共财产?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
相关资源
最近更新 更多