0

UIスレッドにリストビューがあります。時間がかかるため、バックグラウンドワーカーのDoWorkイベントハンドラーを介して実行する操作がいくつかあります。しかし、例外が発生するため、DoWorkハンドラーのリストビューアイテムにアクセスできません。Cross-thread operation not valid: Control 'bufferedListView1' accessed from a thread other than the thread it was created on.

では、DoWorkイベントハンドラーでbufferedlistviewにアクセスするにはどうすればよいですか。これは、DoWorkで処理されるコードです。

foreach (ListViewItem item in bufferedListView1.Items) 
{ 
    string lname = bufferedListView1.Items[i].Text; 
    string lno = bufferedListView1.Items[i].SubItems[1].Text; 
    string gname = bufferedListView1.Items[i].SubItems[2].Text; 
    string line = lname + "@" + lno + "@" + gname; 
    if (gname.Contains(sgroup)) 
    { 
        var m = Regex.Match(line, @"([\w]+)@([+\d]+)@([\w]+)"); 
        if (m.Success) 
        { 
            port.WriteLine("AT+CMGS=\"" + m.Groups[2].Value + "\""); 
            port.Write(txt_msgbox.Text + char.ConvertFromUtf32(26)); 
            Thread.Sleep(4000); 
        } 
        sno++; 
    } 
    i++; 
}
4

3 に答える 3

1

これは、 winformsのコントロールへのクロススレッドアクセスのトピックに関する優れた記事です。

基本的に、UIスレッドからではなくコントロールにアクセスする場合は、必ず使用する必要があります。

control.Invoke

構築します。

于 2012-08-18T06:08:45.853 に答える
0

間違いは、UIコントロールを取得するために別のスレッド(backgrounworkerスレッド)からUIThreadにアクセスしようとしているという事実に起因します

InvokeRequiredを使用して、ここにサンプルのデリゲートを実装する必要があります

 delegate void valueDelegate(string value);

    private void SetValue(string value)
    {
       if (InvokeRequired)
       {
           BeginInvoke(new valueDelegate(SetValue),value);
       }
       else
       {
           someControl.Text = value;
       }
    }
于 2012-08-18T06:09:33.813 に答える
0

私が欲しかったのは、他のスレッドのUIスレッドでリストビューを読むことだけでした。与えられたすべての解決策はinvoke方法を使用していましたが、私はこれを行うためのかなり簡単な方法を見つけました:

ListView lvItems = new ListView(); \\in global scope

私のコードの必要な場所で:

foreach (ListViewItem item in bufferedListView1.Items)
{
   lvItems.Items.Add((ListViewItem)item.Clone()); // Copied the bufferedListview's items that are to be accessed in other thread to another listview- listItems
}

次にlvItemsDoWorkイベントハンドラーでリストビューを使用しました。シンプルn簡単:)

于 2012-08-18T11:15:09.393 に答える