Parameterübergabe BackgroundWorker per Wrapper

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von WinDUser.

    Parameterübergabe BackgroundWorker per Wrapper

    Hallo,

    ich habe eine kurze grundsätzliche Frage, auf die ich keine konkrete Antwort finden konnte.

    ich möchte einen BackgroundWorker in einem von mir erstellten BGWrapper nutzen. Die Parameter für die DoWork-Methode werden in einem Objekt meiner Klasse BGParameter abgelegt und das Ergebnis soll in einem Objekt der Klasse BGResult landen.

    Ist es notwendig, dass ich die Parameter an die DoWork-Methode auf dem klassischen Weg übergebe (also folgendermaßen)

    VB.NET-Quellcode

    1. Class BGWrapper Dim
    2. BGW As New BackgroundWorker With ...
    3. Dim Parameter as BGParameter
    4. Public Sub New()
    5. ' Hier Alles anlegen
    6. End Sub
    7. Public Sub Run()
    8. BGW.RunWorkerAsync(Parameter)
    9. End Sub
    10. Private Sub BGW_DoWork (ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    11. 'Konvertiere hier sender wieder zu BGParameter
    12. 'Mache nun etwas
    13. End SubEnd Class



    Oder kann ich auch auf die Parameter direkt zugreifen:


    VB.NET-Quellcode

    1. Class BGWrapper
    2. Dim BGW As New BackgroundWorker With ...
    3. Dim Parameter as BGParameter
    4. Public Sub New()
    5. ' Hier Alles anlegen
    6. End Sub
    7. Public Sub Run()
    8. BGW.RunWorkerAsync(Parameter)
    9. End Sub
    10. Private Sub BGW_DoWork (ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    11. 'Hier so direkt zugreifen
    12. Parameter.getParameter()
    13. End SubEnd
    14. Class


    Sollte zweites möglich sein, kann ich so auch direkt Ergebnisse in einem Objekt meines Wrappers speichern?

    Vielen Dank euch schon mal für die Hilfe!

    WinDUser
    Willkommen im Forum. :thumbup:
    Schau Dir mal dieses Beispiel an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. BackgroundWorker1.RunWorkerAsync(New BGW_Args)
    4. End Sub
    5. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    6. Dim myArgs As BGW_Args
    7. myArgs = DirectCast(e.Argument, BGW_Args)
    8. MessageBox.Show(myArgs.MyText)
    9. End Sub
    10. Private Class BGW_Args
    11. Public MyText As String = "bla"
    12. End Class
    13. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi. Zweites ist natürlich auch möglich. Im ersten hat sich aber afaik ein fehler eingeschlichen: Nicht sender muss zu BGParameter konvertiert werden, sondern e.Argument.

    Es bleibt also nur die Frage: Was ist sinnvoller?
    Wenn die Paramerter auch an anderen Stellen "benutzt" werden sollen, dann würde ich zu Variante 2 greifen. Gelten sie nur innerhalb des BGW_DoWork, dann zur Variante 1. In Variante 1 ist das Parameter-Objekt nämlich von (ungewollten) zurgirffen außerhalbs (außerhalb des _DoWork) geschützt, du kannst also nicht aus versehen da rumpfuschen. Dein IntelliSense bleibt darüber hinaus auch sauber - warum Objekte auflisten, die du nicht brauchst?

    lg
    Ne, beide Varianten funsten Strict ON - wurde schätze ich nur falsch verstanden weil du in Variante2 Zeile9 einen Parameter übergibst, was natürlich nicht nötig ist. Beide Varianten funktionieren gleich - die einzige Frage ist: von wo aus kann/darf auf Parameter zugegriffen werden? Bei deinem Code ist das natürlich wurstegal, da Parameter eine Private-Variable ist^^

    WinDUser schrieb:

    dass Variante 2 nur mit Strict Off funktioniert?
    Wir bemühen uns hier, einen ordentlichen Stil zu vermitteln, und dazu gehört Option Strict On. Und zwar im Studio über
    Extras -> Optionen -> Projekte und Projektmappen
    ==> VB-Standard (On, On, Binary)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Edit: Mist, ich war etwas langsam.

    @WinDUser:
    Hier ein Tutorial zum BGW: [VB.NET] Multithreading mit BackgroundWorker

    Im zweiten Post steht das mit den Parametern.

    Um sicher zu gehen, sollte man die Parameter mit BGW.RunWorkerAsync(...) übergeben.
    Es sollte z.B. bei Integer, Boolean, String (primitive Datentypen) kein Problem sein, die vom anderen Thread aus zu lesen(!), aber es gehört irgendwo zum sauberen Programmieren dazu.

    Option Strict On gehört sich einfach.
    Das wurde bereits sehr oft durchgekaut. Google es einfach mal und suche es hier rechts oben mit der Suchfunktion.

    Stell es Dir vom Prinzip her so vor: Du hast eine Garage, in die man nur PKWs hineinstellen kann. Wenn Du versuchst, einen LKW hineinzustellen, sagt Dir Option Strict On, dass das nicht gehen kann. Und ende.
    Wenn es möglich ist, und wenn es erforderlich ist, kannst Du selbst den LKW seitlich hinlegen und dann diagonal in die Garage hineinklemmen (oder anders ausgedrückt casten).
    Option Strict Off sagt Dir nicht, dass das nicht geht, sondern es reißt Wände der Garage ein und versucht so den LKW hineinzustopfen... oder es schmeißt den LKW in eine Presse, wodurch er kleiner wird... man weiß es nicht so genau.

    Wenn Du also wissen willst, was mit Deinem LKW und mit Deiner Garage passiert, dann stellst Du Option Strict auf On und stellst, wenn nötig, Deine LKWs selbst passend in die PKW-Garage.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Backgroundworker ist eine obsolete Krücke aus den Zeiten vor den Generika.
    Mit Generika kann man sich einen besseren BW bauen, dem man kein oder auch mehrere typisierte Argumente zur Verarbeitung übergeben kann.
    Ebenso kann der Rück-Transfer von Daten (ProgressChanged oder auch WorkDone) in typisierter Form und mit beliebigen Argumenten erfolgen.

    gugge AsyncWorker - CodeProject