Threadübergreifend auf Listview.items Auflistung zugreifen?

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hallo,

    Es Funktioniert ja soweit alles problemlos, bis auf die Tatsache, dass wenn die Sub "lvAuslesen()" angehalten wird oder längere Zeit für Codeabwicklung benötigt, der UI Zugriff blockiert ist. Ich habe dann zwar einen zweiten Thread der aber leider nicht parallel zum UI Thread läuft?
    Hier der Vollständigkeit halber aber noch der Code:

    VB.NET-Quellcode

    1. Imports System.Data
    2. Imports System.Threading
    3. Imports System
    4. Imports System.Windows.Forms
    5. Public Partial Class MainForm
    6. Public Sub New()
    7. Me.InitializeComponent()
    8. '
    9. ' TODO : Add constructor code after InitializeComponents
    10. '
    11. End Sub
    12. Sub lvAuslesen()
    13. Dim lvx As New ListView
    14. lvx = Me.listView1
    15. lvx.Invoke(Sub()
    16. For Each item1 As ListViewItem In lvx.items
    17. Select Case item1.Text
    18. Case Is = "1"
    19. '....
    20. Case Is = "2"
    21. '....
    22. Case Is = "3"
    23. '....
    24. Case Else
    25. '....
    26. End Select
    27. Thread.Sleep(20)
    28. Next
    29. End Sub)
    30. End Sub
    31. Sub Button1Click(sender As Object, e As EventArgs)
    32. Me.DoSomphing()
    33. End Sub
    34. Sub DoSomphing()
    35. Dim T as New Thread(AddressOf lvAuslesen)
    36. T.Start
    37. End Sub


    VB.NET-Quellcode

    1. Partial Class MainForm
    2. Private Sub InitializeComponent()
    3. Me.button1.Location = New System.Drawing.Point(12, 12)
    4. Me.button1.Name = "button1"
    5. Me.button1.Size = New System.Drawing.Size(75, 23)
    6. Me.button1.TabIndex = 4
    7. Me.button1.Text = "Start1"
    8. Me.button1.UseVisualStyleBackColor = true
    9. AddHandler Me.button1.Click, AddressOf Me.Button1Click
    10. End Sub
    11. Private button1 As System.Windows.Forms.Button
    12. End Class


    Das was in der Sub "lvAuslesen()" abläuft soll den UI Thread in seiner Abarbeitung nicht beeinflussen!
    Das ist es was ich möchte.

    Vielen Danke !

    LG, Thomas
    das was du uns bisher zeigst, müsste imo auch ohne Invoking laufen - entferne das mal.
    Aber vlt. irre ich mich auch, Also nimm genau den hier gezeigten Code, mach das Invoking weg, poste Code, und gib an, in welcher Zeile Fehler - bzw. überzeuge dich, dass gar kein Fehler auftritt.

    Weil wenn kein Fehler auftritt, kann man auch nix helfen.
    Hallo,

    hab das jetzt gemacht was du wolltest:

    VB.NET-Quellcode

    1. Sub lvAuslesen()
    2. Dim lvx As New ListView
    3. lvx = Me.listView1
    4. For Each item1 As ListViewItem In lvx.items
    5. Select Case item1.Text
    6. Case Is = "1"
    7. '....
    8. Case Is = "2"
    9. '....
    10. Case Is = "3"
    11. '....
    12. Case Else
    13. '....
    14. End Select
    15. Thread.Sleep(20)
    16. Next
    17. End Sub


    Folgender Fehler tritt in Zeile 4 auf:

    System.InvalidOperationException: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement listView1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.


    Ergänzend noch ein Hinweis. Ich arbeite mit der .Net Version 4.0.

    Gruß, Thomas

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tomxl01“ ()

    gut, bzw schlecht - offenbar kann man im NebenThread ListViewItems nichtmal abrufen vom ListView. Machs also im HauptThread, so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    2. Dim lvis = New List(Of ListViewItem)(ListView1.Items.Cast(Of ListViewItem))
    3. Dim dlg = New Action(Of List(Of ListViewItem))(AddressOf lvAuslesen)
    4. dlg.BeginInvoke(lvis, AddressOf dlg.EndInvoke, Nothing)
    5. End Sub
    6. Sub lvAuslesen(ByVal lvis As List(Of ListViewItem))
    7. For Each item1 As ListViewItem In lvis
    8. Select Case item1.Text
    9. Case Is = "1"
    10. '....
    11. Case Is = "2"
    12. '....
    13. Case Is = "3"
    14. '....
    15. Case Else
    16. '....
    17. End Select
    18. Thread.Sleep(20)
    19. Next
    20. End Sub