c# – 在WebBrowser中调用脚本,等待它完成运行(同步)
发布时间:2020-12-16 01:54:54 所属栏目:百科 来源:网络整理
导读:我正在使用webBrowser.Document.InvokeScript(“Function”)来运行 javascript,它位于使用 Winforms WebBrowser打开的本地文件中. 问题是,我需要javascript在继续之前完成执行.我该如何等待/倾听? 这是我的C#代码: private void Button1_ItemClick_1(objec
我正在使用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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |