c# – 在WebBrowser中调用脚本,等待它完成运行(同步)

我正在使用webbrowser.Document.InvokeScript(“Function”)来运行 javascript,它位于使用 Winforms Webbrowser打开的本地文件中.

问题是,我需要javascript在继续之前完成执行.我该如何等待/倾听?

这是我的C#代码

private void Button1_ItemClick_1(object sender,DevExpress.XtraBars.ItemClickEventArgs e)
    {
        webbrowser.Document.InvokeScript("Script_A");
        Method_A();
        DialogResult = System.Windows.Forms.DialogResult.OK;
    }

Javascript代码

<script>function Script_A() { Script_B(); }</script>

如何在Script_B完成之前确保没有执行Method_A?

解决方法

使用async / await可以等到执行脚本而不阻塞UI.

public async void AMethod()
{
    string script =
     @"<script>
        function Script_A() { 
            Script_B(); 
            window.external.Completed(); //call C#: CallbackObject's Completed method
        }
        function Script_B(){
            alert('in script');
        }
    </script>";

    taskcompletionsource<bool> tcs = new taskcompletionsource<bool>();

    webbrowser1.ObjectForScripting = new CallbackObject(tcs);
    //Ensure DocumentText is loaded before invoking "InvokeScript",//by extension method "SetDocumentTextAsync" (below)
    await webbrowser1.SetDocumentTextAsync(script);
    webbrowser1.Document.InvokeScript("Script_A");

    await tcs.Task;

    MessageBox.Show("Script executed");
}


[ComVisible(true)]
public class CallbackObject
{
    taskcompletionsource<bool> _tcs = null;

    public CallbackObject(taskcompletionsource<bool> tcs)
    {
        _tcs = tcs;
    }
    public void Completed()
    {
        _tcs.TrySetResult(true);
    }
}

public static class browserExtensions
{
    public static Task SetDocumentTextAsync(this Webbrowser wb,string html)
    {
        taskcompletionsource<object> tcs = new taskcompletionsource<object>();
        WebbrowserDocumentCompletedEventHandler completedEvent = null;
        completedEvent = (sender,e) =>
        {
            wb.DocumentCompleted -= completedEvent;
            tcs.SetResult(null);
        };
        wb.DocumentCompleted += completedEvent;

        wb.ScriptErroRSSuppressed = true;
        wb.DocumentText = html;

        return tcs.Task;
    }
}

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...