我有WebBrowser控件,我正在调用一个函数来从一个线程获取所有控件ID。当我从UI线程调用它时,函数可以正常工作,但是如果从单独的线程调用它则不会得到任何控制。
我迷路了请帮忙
主叫:
List<WebOparator.WebOparator.WebControls> wcList = oparator.GetAllControlName();
int tryCount = 0;
do
{
if (wcList.Count == 0)
{
tryCount++;
Thread.Sleep(2000);
wcList = oparator.GetAllControlName();
}
if (tryCount >= 5) break;
} while (wcList.Count == 0);
方法:
public List<WebControls> GetAllControlName()
{
List<WebControls> names = new List<WebControls>();
if (this.InvokeRequired)
{
this.BeginInvoke((MethodInvoker)delegate
{
int i = 0;
foreach (HtmlElement element in myBrowser1.Document.All)
{
if (element.Id != null)
{
i++;
names.Add(new WebControls() { sl = i, ID = element.Id, TagName = element.TagName });
}
}
});
}
else
{
int i = 0;
foreach (HtmlElement element in myBrowser1.Document.All)
{
if (element.Id != null)
{
i++;
names.Add(new WebControls() { sl = i, ID = element.Id, TagName = element.TagName });
}
}
}
return names;
}
编辑:
我发现该函数循环遍历所有控件并将它们添加到列表中但返回一个空列表....
答案 0 :(得分:1)
BeginInvoke()
是异步的
在代码的其余部分完成后,该委托在UI线程上运行。
您需要Invoke()
,它将同步等待委托完成运行。