【问题标题】:WebBrowser control get all controls on a thread not workingWebBrowser 控件获取线程上的所有控件不起作用
【发布时间】:2013-06-03 17:23:27
【问题描述】:

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


    }

编辑:

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

【问题讨论】:

  • 不要这样做。请改用 HTML Agility Pack。
  • catch { throw; }没有意义

标签: c# winforms web-control


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2015-01-15
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2011-01-01
    相关资源
    最近更新 更多