C# Xilium CefGlue-如何同步获取HTML源代码?

C# Xilium CefGlue-如何同步获取HTML源代码?,c#,chromium-embedded,cefglue,C#,Chromium Embedded,Cefglue,我想从非UI线程(屏幕外浏览器)中获取CEF3/Xilium CefGlue中的网页源代码 我这样做 internal class TestCefLoadHandler : CefLoadHandler { protected override void OnLoadStart(CefBrowser browser, CefFrame frame) { // A single CefBrowser instance can handle multiple requ

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

我这样做

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; }
    }
}
内部类TestCefLoadHandler:CefLoadHandler
{
受保护的覆盖无效OnLoadStart(CefBrowser浏览器,CEFRAME框架)
{
//如果存在帧(即),单个浏览器实例可以处理对单个URL的多个请求。
if(帧IsMain)
{
WriteLine(“开始:{0}”,browser.GetMainFrame().Url);
}
}
受保护的覆盖无效OnLoadEnd(CefBrowser浏览器、CEFRAME框架、int httpStatusCode)
{
if(帧IsMain)
{
MyCefStringVisitor mcsv=新的MyCefStringVisitor();
frame.GetSource(mcsv);
WriteLine(“END:{0},{1}”,browser.GetMainFrame().Url,httpStatusCode);
}
}
}
类MyCefStringVisitor:CefStringVisitor
{
私有字符串html;
受保护的覆盖无效访问(字符串值)
{
html=值;
}
公共字符串Html
{
获取{return html;}
设置{html=value;}
}
}
但是对GetSource(…)的调用是异步的,所以在尝试对结果执行任何操作之前,我需要等待调用发生

GetSource(...)
我如何才能等待呼叫发生

根据Alex Maitland的提示,我可以调整实现()来做类似的事情

我这样做:

    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;
    }
}  
protectedoverride async void OnLoadEnd(CefBrowser浏览器,CEFRAME框架,int-httpStatusCode)
{
if(帧IsMain)
{
//主通话在这里进行
字符串HTMLsource=await browser.GetSourceAsync();
WriteLine(“END:{0},{1}”,browser.GetMainFrame().Url,httpStatusCode);
}
}
公共类TaskStringVisitor:CefStringVisitor
{
专用只读TaskCompletionSource TaskCompletionSource;
公共TaskStringVisitor()
{
taskCompletionSource=新的taskCompletionSource();
}
受保护的覆盖无效访问(字符串值)
{
taskCompletionSource.SetResult(值);
}
公共任务
{
获取{return taskCompletionSource.Task;}
}
}
公共静态类扩展
{
公共静态任务GetSourceAsync(此浏览器)
{
TaskStringVisitor TaskStringVisitor=新建TaskStringVisitor();
browser.GetMainFrame().GetSource(taskStringVisitor);
返回taskStringVisitor.Task;
}
}  

GetSource(),它是void方法而不是任务。我无法等待GetSource(…)您如何处理
HTMLSource
?有没有办法打破这种回调方法,让你可以使用它?也许把它分配给公共财产?