我在用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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)