0

我有 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;


    }

编辑:

我发现该函数循环遍历所有控件并将它们添加到列表中,但返回一个空列表....

4

1 回答 1

1

BeginInvoke()是异步的。
其余代码完成后,该委托在 UI 线程上运行。

你想要Invoke(),它将同步等待委托完成运行。

于 2013-06-03T17:25:11.407 回答