2016-04-23 3 views
-2

私はウェブサイトからリンクをリーチするためにスレッドを使用しようとしていますが、実行しようとしています。これは、エラーを示しています。c# - クロススレッド操作が有効でないListView

Cross-thread operation not valid: Control 'listView1' accessed from a thread other than the thread it was created on

マイコード:

try 
{ 
    foreach (HtmlNode node in (IEnumerable<HtmlNode>)document.DocumentNode.SelectNodes("//table[@class='tbl' and @id='stats']//tr[@class='' or @class='bg']")) 
    { 
    HtmlAgilityPack.HtmlDocument document2 = new HtmlAgilityPack.HtmlDocument(); 
    document2.LoadHtml(node.InnerHtml); 
    try 
    { 
    string str6 = document2.DocumentNode.SelectSingleNode("//td[2]//a").Attributes["href"].Value; 
    string innerText = document2.DocumentNode.SelectSingleNode("//td[2]//a").InnerText; 
    string[] items = new string[] { listView1.Items.Count + 1.ToString(), innerText, str6, "" }; 
    ListViewItem item = new ListViewItem(items); 
    listView1.Items.Add(item); 
    listView1.EnsureVisible(listView1.Items.Count - 1); 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message); 
    } 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

'' InvokeRequired''メンバープロパティは、あなたの友達です;) – BitTickler

+0

私はInvokeRequiredを追加することができますどのように? –

+0

インデントもあなたの友人です。お願いします。 –

答えて

1

は、これは、コントロールのスレッドの親和性です。それらは作成されたスレッド上でのみ更新できます。 InvokeRequiredInvokeは同じスレッド上のコントロールを更新する方法を提供します:

 if (listView1.InvokeRequired) 
     { 
      listView1.Invoke((MethodInvoker) delegate() 
      { 
       ListViewItem item = new ListViewItem(items); 
       listView1.Items.Add(item); 
       listView1.EnsureVisible(listView1.Items.Count - 1); 
      }); 
     } 
+0

そこにあります。私はラムダが追加される前にこれを最後に使ったと思います;)しかし、通常は重複したコードを避けるために、elseとリストビュー上の実際のコードを一度だけ定義しています。 – BitTickler

+0

この質問の何百もの既存の重複と比較して、質の低い回答。標準的な投稿をする場合は、少なくともいくつかの努力を払うようにしてください –

関連する問題