C# InvokeMember(“单击”)不';不能在线程内的webBrowser控件中工作

C# InvokeMember(“单击”)不';不能在线程内的webBrowser控件中工作,c#,.net,winforms,multithreading,webbrowser-control,C#,.net,Winforms,Multithreading,Webbrowser Control,我正在尝试创建一个多线程应用程序,它创建WebBrowser并对每个WebBrowser执行特定的操作。当我尝试从主线程运行代码时,效果很好,但是,当我将代码更改为从线程运行时,代码运行良好,直到调用InvokeMember(“单击”),但什么也没有发生InvokeMember()未执行,也未单击按钮。这是我的密码: private void button1_Click(object sender, EventArgs e) { Thread t = new Thread(Work);

我正在尝试创建一个多线程应用程序,它创建WebBrowser并对每个WebBrowser执行特定的操作。当我尝试从主线程运行代码时,效果很好,但是,当我将代码更改为从线程运行时,代码运行良好,直到调用
InvokeMember(“单击”)
,但什么也没有发生<代码>InvokeMember()未执行,也未单击按钮。这是我的密码:

private void button1_Click(object sender, EventArgs e)
{
    Thread t = new Thread(Work);
    t.SetApartmentState(ApartmentState.STA);
    t.Start();      
}

[STAThread]
void Work()
{
    WebBrowser wb = new WebBrowser();
    wb.ScriptErrorsSuppressed = false;
    wb.Visible = true;
    wb.Navigate("http://website.com");

    while (wb.ReadyState != WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }
    //updateText("Loaded");
    wb.Document.GetElementById("F1").SetAttribute("Value", "Test");
    wb.Document.GetElementById("F2").SetAttribute("Value", "Saracostaz");
    wb.Document.GetElementById("F3").SetAttribute("Value", "Tester5123@hotmail.com");
    wb.Document.GetElementById("F4").SetAttribute("Value", "Tester5123@hotmail.com");
    wb.Document.GetElementById("F5").SetAttribute("Value", "limewire");
    wb.Document.GetElementById("F6").SetAttribute("SelectedIndex", "1");
    wb.Document.GetElementById("F7").SetAttribute("SelectedIndex", "2");
    wb.Document.GetElementById("F8").SetAttribute("SelectedIndex", "5");
    wb.Document.GetElementById("F9").SetAttribute("SelectedIndex", "20");
    // updateText("Entered Data");

    HtmlElementCollection elements = wb.Document.Body.All;
    foreach (HtmlElement element in elements)
    {
        string valueAttribute = element.GetAttribute("value");
        if (!string.IsNullOrEmpty(valueAttribute) && valueAttribute == "Sign Up")
        {
            element.InvokeMember("click");
            //MessageBox.show("I am in"); //that messagebox shows normally.
            break;
        }
    }
}
请注意,从主线程调用Work()时,它的运行非常正确。问题在于从另一个线程调用它


提前感谢。

JFYI,您可以使用LINQ执行下一步操作:

var element = elements
    .OfType<HtmlElement>()
    .Select(element => element.GetAttribute("value"))
    .FirstOrDefault(value=> String.Equals(value, "Sign Up"));
if (element != null)
    element.InvokeMember("click");
var元素=元素
第()类
.Select(element=>element.GetAttribute(“值”))
.FirstOrDefault(值=>String.Equals(值,“注册”);
if(元素!=null)
元素。调用成员(“单击”);

JFYI,您可以使用LINQ执行下一步操作:

var element = elements
    .OfType<HtmlElement>()
    .Select(element => element.GetAttribute("value"))
    .FirstOrDefault(value=> String.Equals(value, "Sign Up"));
if (element != null)
    element.InvokeMember("click");
var元素=元素
第()类
.Select(element=>element.GetAttribute(“值”))
.FirstOrDefault(值=>String.Equals(值,“注册”);
if(元素!=null)
元素。调用成员(“单击”);

您违反了STA线程的硬要求,它必须泵送一个消息循环。您通过调用Application.DoEvents()使用Navigate方法解决了问题。这将推动消息循环。但你这样做不是为了InvokeClick


检查解决方案。将代码放入DocumentCompleted事件中。我看不出有什么明显的方法来决定何时停止线程,您可能需要用定时器轮询单击的某种副作用。

您违反了STA线程的硬要求,它必须泵送一个消息循环。您通过调用Application.DoEvents()使用Navigate方法解决了问题。这将推动消息循环。但你这样做不是为了InvokeClick

检查解决方案。将代码放入DocumentCompleted事件中。我看不出有什么明显的方法来决定何时停止线程,您可能需要用定时器来轮询点击的某种副作用