ChromiumFX - 如何同步获取 HTML 源?

ChromiumFX - How to get HTML source synchonously?

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

我这样做

void loadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e)
{
    // Get HTML code
    string htmlSource;

    CfxStringVisitor sv = new CfxStringVisitor();
    sv.Visit += ((se, ee) => { htmlSource = ee.String; });
    browser.MainFrame.GetSource(sv);
}

但是 htmlSource 总是 NULL。

如何同步获取 HTML 源?

我找到了。这是我的解决方案。

基于 CefSharp TaskStringVisitor 实现(https://github.com/cefsharp/CefSharp/blob/master/CefSharp/TaskStringVisitor.cs

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

        public TaskStringVisitor()
        {
            taskCompletionSource = new TaskCompletionSource<string>();
            this.Visit += TaskStringVisitor_Visit;
        }

        void TaskStringVisitor_Visit(object sender, Chromium.Event.CfxStringVisitorVisitEventArgs e)
        {
            try
            {
                taskCompletionSource.SetResult(e.String);
            }
            catch (Exception ex)
            {
                taskCompletionSource.SetException(ex);
            }
        }

        public Task<string> Task
        {
            get { return taskCompletionSource.Task; }
        }
    }
    public Task<string> GetSourceAsync()
    {
        TaskStringVisitor taskStringVisitor = new TaskStringVisitor();
        browser.MainFrame.GetSource(taskStringVisitor);

        return taskStringVisitor.Task;
    }

    async void loadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e)
    {
        // Get HTML code
        string HTMLsource = await GetSourceAsync();
    }