Zugriff auf ListView von externen Thread

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von pts.

    petaod schrieb:

    Wenn der Thread in derselben Klasse wie Mainform codiert ist, müsste die besagte Adressierung mit Me funktionieren.
    Me anstelle von Form1 im Code verwenden: also z.B. Me.BeginInvoke(...
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wo läuft der Thread?
    In einer eigenen Klasse?
    In einem Modul?

    Wenn du die Klasse instanzierst, übergib ihr den Caller,
    In Form1

    VB.NET-Quellcode

    1. ​Dim tc As New ThreadClass(Me)

    In der ThreadClass

    VB.NET-Quellcode

    1. ​Private CallerForm As Form
    2. Public Sub New(Caller As Form)
    3. CallerForm = Caller
    4. End Sub

    Beim Invoken:

    VB.NET-Quellcode

    1. ​CallerForm.BeginInvoke ...
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok, testhalber:

    VB.NET-Quellcode

    1. Private Async Sub FrmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    2. Await Threading.Tasks.Task.Run(Sub() AddToList(New ListViewItem({"a", "b"})))
    3. End Sub
    4. Private Sub AddToList(LVI As ListViewItem)
    5. Me.BeginInvoke(Sub() TestListView.Items.Add(LVI))
    6. End Sub

    Im FormShown-EventHandler wird ein Nebenthread erzeugt, der AddToList nebenläufig aufruft. Sowohl mit TestListView.BeginInvoke als auch mit Me.BeginInvoke läuft es. Finde den relevanten Unterschied zu Deinem Code und poste diesen bitte für uns zur Aufklärung/Analyse und die Nachwelt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.