C# 在类库中使用WebBrowser控件
我试图在类库中使用这个控件,但是当我运行下面的代码时,我没有看到发送到google的请求(使用fiddler) 我猜这与线程有关,可能是线程在控件有机会发送请求之前结束。但我不知道从哪里开始解决这个问题 解决方案 我发现这个解决方案可以工作,事件被触发,主线程等待STA线程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() {
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.");
}
}