2016-10-13 3 views
-1

使うにあたって:私は私が持っているもの、それに対処するための最良の方法だろう私の現在のアプリケーション・スレッドで、スレッドのまわりで私の頭を取得しようとしているスレッド

public void threadsTest() { 
     Invoke(new MethodInvoker(() => { 
     // loop over the listview getting the first value 
     foreach (ListViewItem item in listViewBacklinks.Items) 
     { 
      // try... 
      try 
      { 
       var mainURL = item.Text; 
       using (WebClient wc = new WebClient()) 
       { 
        try 
        { 
         var pageHtml = wc.DownloadString(mainURL); 
         if (pageHtml.Contains(Text)) 
         { 
          var subitems = item.SubItems.Add("<a href=\"" + item.SubItems[1].Text + "\">anchor text</a>"); 
          item.BackColor = Color.Green; 
         } 
         else 
         { 
          item.BackColor = Color.Red; 
         } 
        } catch (Exception) 
        { 
         item.BackColor = Color.Red; 
        } 
         //Helpers.returnMessage("Work done!"); 
        } 
       } catch (Exception ex) { 
       Helpers.returnMessage(ex.ToString()); 
      } 
     }})); 
    } 

    private void btnAnalyzeAnchorText_Click(object sender, EventArgs e) 
    { 
     // attempting threads 
     var t = new Thread(threadsTest); 
     t.Start(); 
    } 

私はBackgroundWorkerのそれのように考えをGUIをフリーズすることはありませんでしたが、GUI要素にアクセスするためにinvokeを入れました。私はそれが正しいとは思わないでしょう、今のところGUIは仕事が終わるまで応答しません。私はいくつかのチュートリアルを見ましたしかし、それは完全に沈んでいない、任意のヘルプ/クラップスのヒントは素晴らしいだろう。

+0

'Invoke()'はUIスレッドで指定されたコードを実行するので、あなたのUIがブロックされているのは不思議ではありません。 Invoke/Beginあなたができるコードの最小部分だけをインボークします(ここでBackColorを設定します)。あなたのリストが大きすぎる場合は、UIをあまりに頻繁に更新することで問題が発生する可能性があります。私は、あなたがしようとしていることをよりエレガントにする方法としてasync/awaitを調べることをお勧めします。 –

+0

[c#アプリケーションのGUIをフリーズせずにプロセスを実行する]の可能な複製(http://stackoverflow.com/questions/2773448/c-sharp-run-process-without-freezing-my-apps-gui) –

+0

WebClientは、 GUIの要素なので、あなたのアプリケーションは単にスレッドに適していません。 –

答えて

0

これは、あなたが何をする必要があるかです:

public void threadsTest(string[] urls) 
{ 
    var results = new Dictionary<string, string>(); 
    foreach (string mainURL in urls) 
    { 
     using (WebClient wc = new WebClient()) 
     { 
      var pageHtml = wc.DownloadString(mainURL); 
      results[mainUrl] = pageHtml; 
     } 
    } 
    Invoke(new MethodInvoker(() => ProcessResults(results))); 
} 

このコードにはUI要素、WebClientのちょうど力仕事はありません。

新しいProcessResultsでは、UIスレッドに戻りますので、結果を設定できます。

スレッドの呼び出しは、urls(文字列)の配列を渡す必要がありますが、スレッドを作成する前に取得して、UIスレッドに残っているので安全です。

関連する問題