Val*_*sen 4 javascript c# browser winforms
我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;
}
Run Code Online (Sandbox Code Playgroud)
Javascript代码:
<script>function Script_A() { Script_B(); }</script>
Run Code Online (Sandbox Code Playgroud)
如何在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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9088 次 |
| 最近记录: |