我正在使用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 举报,一经查实,本站将立刻删除。