C# 在类库中使用WebBrowser控件

C# 在类库中使用WebBrowser控件,c#,winforms,multithreading,webbrowser-control,C#,Winforms,Multithreading,Webbrowser Control,我试图在类库中使用这个控件,但是当我运行下面的代码时,我没有看到发送到google的请求(使用fiddler) 我猜这与线程有关,可能是线程在控件有机会发送请求之前结束。但我不知道从哪里开始解决这个问题 解决方案 我发现这个解决方案可以工作,事件被触发,主线程等待STA线程 public class WebThread { private WebBrowser web { get; set; } public void StartBrowser() {

我试图在类库中使用这个控件,但是当我运行下面的代码时,我没有看到发送到google的请求(使用fiddler)

我猜这与线程有关,可能是线程在控件有机会发送请求之前结束。但我不知道从哪里开始解决这个问题

解决方案 我发现这个解决方案可以工作,事件被触发,主线程等待STA线程

public class WebThread
{
    private WebBrowser web { get; set; }

    public void StartBrowser()
    {
        web = new WebBrowser();
        web.Visible = true;
        web.DocumentCompleted += Web_DocumentCompleted;
        web.ScriptErrorsSuppressed = true;
        web.Navigate("http://www.google.com");

        Application.Run();

        web.Dispose();
    }

    private void Web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        Debug.Print("Arrived: " + e.Url.ToString());

        if (e.Url.ToString() == "http://www.google.com.au/")
        {
            Application.ExitThread();
        }
    }
}


public class WebBrowserTest
{
    public WebBrowserTest()
    {
        Debug.Print("Thread is starting.");
        var webThread = new WebThread();

        var t = new Thread(webThread.StartBrowser);
        t.SetApartmentState(ApartmentState.STA);
        t.Start();

        while(t.IsAlive)
        {
            Thread.Sleep(5000);
        }

        Debug.Print("Thread has finished.");
    }
}
WebBrowser.Navigate(…)
不会阻塞-它会在发送请求之前立即返回。由于线程函数随后退出,因此整个线程结束并使用它获取
WebBrowser
控件


如果你只是想下载一个网页,看看这个课程。它有许多异步方法,这意味着您甚至不必创建自己的线程。

想想当线程结束时,变量web会发生什么。UI控件只能在主前台线程中使用;我不确定在后台线程中创建时它的行为。可能的重复注意:代码有一个微妙的问题:我们启动了到google.com的导航,但随后重定向将我们发送到本地谷歌服务。在OP的情况下,它可能是www.google.com.au,但在您的情况下,它可以是另一个url(例如),代码将挂起,因为线程永远不会退出。WebClient在这种情况下不工作,因为我需要执行javascript。但是你的答案是正确的。我在下面添加了我的解决方案。
public class WebThread
{
    private WebBrowser web { get; set; }

    public void StartBrowser()
    {
        web = new WebBrowser();
        web.Visible = true;
        web.DocumentCompleted += Web_DocumentCompleted;
        web.ScriptErrorsSuppressed = true;
        web.Navigate("http://www.google.com");

        Application.Run();

        web.Dispose();
    }

    private void Web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        Debug.Print("Arrived: " + e.Url.ToString());

        if (e.Url.ToString() == "http://www.google.com.au/")
        {
            Application.ExitThread();
        }
    }
}


public class WebBrowserTest
{
    public WebBrowserTest()
    {
        Debug.Print("Thread is starting.");
        var webThread = new WebThread();

        var t = new Thread(webThread.StartBrowser);
        t.SetApartmentState(ApartmentState.STA);
        t.Start();

        while(t.IsAlive)
        {
            Thread.Sleep(5000);
        }

        Debug.Print("Thread has finished.");
    }
}