我有以下 C# 代码从 .NET Windows Forms WebBrowser 控件中获取 DIV 的 html 元素文本值:
private void cmdGetText_Click(object sender, EventArgs e)
{
string codeString = string.Format("$('#testTextBlock').text();");
object value = this.webBrowser1.Document.InvokeScript("eval", new[] { codeString });
MessageBox.Show(value != null ? value.ToString() : "N/A", "#testTextBlock.text()");
}
private void myTestForm_Load(object sender, EventArgs e)
{
webBrowser1.DocumentText =
@"<!DOCTYPE html><html>
<head>
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js'></script>
</head>
<body>
<div id='testTextBlock'>Lorem ipsum dolor sit amet, consectetur adipisicing elit...</div>
</body>
</html>";
}
它运作良好。它同步工作。
这是 cmdGetText_Click 方法的第一个异步变体:
private async void cmdGetText_Click(object sender, EventArgs e)
{
string codeString = string.Format("$('#testTextBlock').text();");
object value = await Task.Factory.StartNew<object>(() =>
{
return this.Invoke(
new Func<object>(() =>
{
return
this.webBrowser1.Document
.InvokeScript("eval", new[] { codeString });
}));
});
MessageBox.Show(value != null ? value.ToString() : "N/A", "#myTestText.text()");
}
这是 cmdGetText_Click 方法的第二个异步变体:
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class myTestForm : Form {
...
private async void cmdGetText_Click(object sender, EventArgs e)
{
webBrowser1.ObjectForScripting = this;
string codeString = string.Format("window.external.SetValue($('#testTextBlock').text());");
await Task.Run(() =>
{
this.Invoke((MethodInvoker)(()=>{this.webBrowser1.Document.InvokeScript("eval", new[] { codeString });}));
});
}
public void SetValue(string value)
{
MessageBox.Show(value != null ? value.ToString() : "N/A", "#myTestText.text()");
}
问题:原始 cmdGetText_Click 方法是否有任何其他实用的异步变体,这些变体将使用除此处介绍的其他方法吗?如果您在此处发布它们,请您也发布您为什么更喜欢主题任务的编码解决方案方法的原因。
谢谢你。
[更新]
这是一个屏幕截图,展示了在 UI 线程的第一个示例/异步变体中访问 WebBrowser 控件。
[更新]
这是一个屏幕截图,展示了在 UI 线程的第二个示例/异步变体中访问 WebBrowser 控件。