微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐