C#挂起并在Application.Run()for for循环后卡住

Bes*_*stR 13 c# wpf multithreading for-loop webbrowser-control

我正在建立一个冲浪到几个网站并做一些事情的程序.

在成功冲浪到5个网址之后,该程序在Application.Run()行之后挂起.该程序甚至没有进入处理程序功能,只是卡住了.此时CPU使用率为0.

我尝试以任何可能的方式关闭线程.我做错了什么?

我这样做:

[STAThread]
private static void Main(string[] args) 
{
    for (int i = 0; i < urls.Count; i++) 
    {
        var th = new Thread(() = > 
        {
            var weBrowser = new WebBrowser();
            weBrowser.AllowNavigation = true;
            weBrowser.DocumentCompleted += Handler;
            weBrowser.Navigate(urls[i]);
            Application.Run();
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Start();
        th.Join();
    }
}
Run Code Online (Sandbox Code Playgroud)

而我的Handle功能是:

private static void Handler(object sender, WebBrowserDocumentCompletedEventArgs e) 
{
    WebBrowser weBrowser = sender as WebBrowser;
    var htmlDocument = weBrowser.Document;

    /*do something*/

    Application.Exit();
    Application.ExitThread();

    weBrowser.Dispose();
    weBrowser.Stop();

    Thread.CurrentThread.Abort();
}
Run Code Online (Sandbox Code Playgroud)

我的问题非常类似于: Application.Run()导致应用程序挂起

这个问题也没有答案.

谢谢!

Mar*_*ila 9

我认为你犯了几个错误:

  • 你正在加入里面看看
  • 你Application.Exit()在每个处理程序调用中调用

您应该在for循环外移动连接,不要调用Application.Exit.

以下示例似乎运行良好:

static class Program
{
  [STAThread]
  static void Main()
  {
     var urls = new List<string>() { 
        "http://stackoverflow.com",
        "http://stackoverflow.com",
        "http://stackoverflow.com",
        "http://stackoverflow.com",
        "http://stackoverflow.com",
        "http://stackoverflow.com",
        "http://stackoverflow.com",
        "http://stackoverflow.com"};

     var threads = new Thread[urls.Count];

     for (int i = 0; i < urls.Count; i++)
     {
        threads[i] = new Thread((url) =>
        {
           var weBrowser = new WebBrowser();
           weBrowser.AllowNavigation = true;
           weBrowser.DocumentCompleted += Handler;
           weBrowser.Navigate(url as string);
           Application.Run();
        });
        threads[i].SetApartmentState(ApartmentState.STA);
        threads[i].Start(urls[i]);
     }

     foreach (var t in threads)
        t.Join();

     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new Form1());
  }

  private static void Handler(object sender, WebBrowserDocumentCompletedEventArgs e)
  {
     WebBrowser weBrowser = sender as WebBrowser;

     var htmlDocument = weBrowser.Document;

     /*do something*/

     Application.ExitThread();

     weBrowser.Dispose();
     weBrowser.Stop();
  }
}
Run Code Online (Sandbox Code Playgroud)