Klasse(n) Frage zum simultanen Kopieren von Dateien

  • VB.NET
  • .NET (FX) 4.0

Es gibt 59 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    RodFromGermany schrieb:

    vielfrager schrieb:

    die vielen asynchron arbeitenden Kopier-Subs
    von wieviel Festplatten auf wieviel Festplatten?


    @RodFromGermany:
    Derzeit von 20 auf 10, so abgesichert, dass eine Festplatte zeitgleich immer nur für einen Kopiervorgang als Quelle oder Ziel dient

    @ErfinderDes Rades:
    Die Kopiervorgänge starten in der jetztigen Anwendung automatisch, also nicht durch ButtonClick.
    Ungeachtet dessen versuche ich mal ein Bild anzuhängen, auf dem man erkennt, dass sich bei Deinem Code ein (mir unbekannter Fehler) zeigt.
    Bilder
    • button_error.png

      101,92 kB, 1.920×1.040, 90 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „vielfrager“ ()

    vielfrager schrieb:

    Fehler
    Async und Handles passt nicht zusammen.
    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!

    ErfinderDesRades schrieb:

    klar passt das.
    Tatsächlich.
    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!

    ErfinderDesRades schrieb:

    wie man eine Methode in einer separaten Klasse überhaupt aufruft, dann kannst du das auch asynchron tun.


    Eben den asynchronen Aufruf bekomme ich nicht hin.

    ErfinderDesRades schrieb:

    Die Frage ist allenfalls, welchen Sinn die separate Klasse eigentlich haben soll.


    Um nicht für jeden Kopiervorgang, der irgendwann einmal startet, eine extra-Sub vorhalten zu müssen. Ich dachte, das wäre einer der Vorteile der oop - redundanten Code zu vermeiden? Aber gut möglich, dass ich auch da was falsch verstehe.
    Gibts wirklich keine Ideen, wie ich das, was derzeit mit vielen BGW's funktioniert, mit deutlicher weniger Zeilen umzusetzen ist?
    FW 4

    VB.NET-Quellcode

    1. Public Class copy_class
    2. Sub New()
    3. End Sub
    4. Public Sub start(ByVal sSrcPath As String, ByVal sDestPath As String)
    5. Try
    6. If Not System.IO.Directory.Exists(sDestPath) Then
    7. System.IO.Directory.CreateDirectory(sDestPath)
    8. End If
    9. Dim sFiles() As String = System.IO.Directory.GetFiles(sSrcPath)
    10. Dim sFile As String
    11. For i As Integer = 0 To sFiles.Length - 1
    12. sFile = sFiles(i).Substring(sFiles(i).LastIndexOf("\") + 1)
    13. If Not System.IO.File.Exists(sDestPath & "\" & sFile) Then
    14. System.IO.File.Copy(sFiles(i), sDestPath & "\" & sFile, True)
    15. End If
    16. Next i
    17. Dim sDirs() As String = System.IO.Directory.GetDirectories(sSrcPath)
    18. Dim sDir As String
    19. For i As Integer = 0 To sDirs.Length - 1
    20. If sDirs(i) <> sDestPath Then
    21. sDir = sDirs(i).Substring(sDirs(i).LastIndexOf("\") + 1)
    22. start(sDirs(i), sDestPath & "\" & sDir)
    23. End If
    24. Next i
    25. Catch ex As Exception
    26. End Try
    27. End Sub
    28. End Class


    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim los As copy_class = New copy_class()
    3. los.start("d:\testvb\", "c:\users\x\desktop\testvb")
    4. End Sub

    ganz nach Schema F:

    VB.NET-Quellcode

    1. Private Async Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim los As copy_class = New copy_class()
    3. Await task.Run(Sub() los.start("d:\testvb\", "c:\users\x\desktop\testvb"))
    4. End Sub


    Nur welchen Sinn hat nu die copy_class?
    Was macht die, was die Methode darin nicht ebensogut auch ohne die class drumrum machen täte?
    Bislang (FW4) war nach meinem Kenntnisstand eine Sub nicht bzw. nur über BGW asynchron ausführbar.
    Ich muss also für jeden der zeitgleich möglichen Kopiervorgänge eine Sub vorhalten bzw. bei Programmanpassungen auch pflegen.
    Ist es also richtig, dass ich das mit FW 4.5. durch asynchronen Aufruf EINER Sub (ohne Klassendingsbums) lösen kann?
    Das wäre ja viel zu einfach !? :D ?( :D

    Edit:
    Wenn sich die Sub wie in Zeile 29 selbst aufruft, geschieht das aber doch synchron, womit sich die Katze in den Schwanz beißt?

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

    vielfrager schrieb:

    Bislang (FW4) war nach meinem Kenntnisstand eine Sub nicht bzw. nur über BGW asynchron ausführbar.
    naja, ohne BGW gings auch mit FW4, halt anders.
    Wie gesagt:

    ErfinderDesRades schrieb:

    Backgroundworker: :thumbdown:
    klar soweit?

    vielfrager schrieb:

    Wenn sich die Sub wie in Zeile 29 selbst aufruft, geschieht das aber doch synchron, womit sich die Katze in den Schwanz beißt?
    das geschieht in dem Thread, in dem die Methode halt läuft.
    Ob deswegen nu eine Katze sich Schwanz beißt - was immer damit gemeint sein mag - ist glaub völlig schnuppe.

    Also wenn du eine Methode in einem Nebenthread aufrufst, dann läuft die asynchron zum Hauptthread. Und alle Methoden, die diese Methode aufruft, laufen logisch in ihrem Thread, also laufen synchron zum Nebenthread der Methode, und laufen asynchron zum Hauptthread.

    vielfrager schrieb:

    Ich habe ... ein kleines Programm geschrieben, das zwischen zwei Rechnergruppen (nennen wir sie A-F und 1-10) sehr große Dateien hin und her kopiert.

    Stellt sich hier eigentlich niemand die Frage, wozu man Copyroutinen neu erfinden muss?
    Du kannst mit Deinem Kenntnisstand noch lange tüfteln und wirst nicht in die Regionen von Robocopy & co. vordringen - wie wäre es, wenn Du Dir das Programm ansiehst und die überwältigenden und genialen Möglichkeiten Deinen Bedürfnissen anpasst?

    simpelSoft schrieb:


    Du kannst mit Deinem Kenntnisstand noch lange tüfteln und wirst nicht in die Regionen von Robocopy & co. vordringen - wie wäre es, wenn Du Dir das Programm ansiehst und die überwältigenden und genialen Möglichkeiten Deinen Bedürfnissen anpasst?

    Ich habe nicht behauptet, eine eierlegende Wollmichsau programmieren zu wollen. Die zu optimierende Kopierroutine, um die es ging, ist nur ein kleiner Teil einiger ineinandergreifender Anwendungen, mit denen hier eine ganze Menge gesteuert wird. Natürlich gab es auch Erwägungen, externe Komponenten hinzuzuziehen. Aber die Gesamtanforderungen wären so nicht erfüllbar gewesen.
    Ich schlag' mir ja nicht aus Spaß die Nächte um die Ohren ;)

    vielfrager schrieb:

    Gesamtanforderungen
    die da wären?
    Miot ein wenig Information drum herum lässt es sich wesentlich besser helfen. :/
    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!
    und von meiner Warte aus ists niemals ein vertaner Aufwand, den Async-Pattern zu verstehen.
    Selbst wenn sich im Nachhinein eine noch bessere Lösung findet, etwa mit RoboCopy.
    Ich bin eh froh, dass bislang niemand die eigliche Kopier-Funktion zu diskutieren hat angefangen (obwohl dies auch nötig hätte).
    Weil das hätte den Thread ziemlich verzettelt.
    Aber nun kann man sich weiterem widmen, ob nun den Kopier-Funktion-Details oder dem ganz anderen RoboCopy-Ansatz.
    Ich hab' ne kleine Firma, die in keine Branchenschublade passt. Demzufolge gibts auch keine Branchenlösungen. Über die Jahre ist mit der Firma auch der Wunsch gewachsen, die Auftragsbearbeitung zu standardisieren und rechnergestützt zu betreiben. Eine Firma mit der Programmierung zu beauftragen, hätte unseren Finanzhorizont weiiiiit überschritten. (Ungeachtet dessen, dann eine Blackbox zu haben, für dessen Wartung/Erweiterung der Anbieter jeden Preis verlangen kann, von seiner theoretisch möglichen Insolvenz mal abgesehen)
    Also hab' ichs mir in den letzten vier Jahren mehr oder weniger schlecht selbst beigebracht (und ein klitzekleines bisschen hier in Erfahrung gebracht) und die Teilprogramme (jetzt 15 Komponenten) scheibchenweise eingeführt. Nun läuft alles relativ stabil und ich nutze die frei gewordene Zeit für eine generelle Überarbeitung. Dazu gehören auch die hier besprochenen Kopierfunktionalitäten, die in Abhängigkeit der anderen Komponenten aktiv werden.
    Learning by doing in Reinkultur sozusagen.

    vielfrager schrieb:

    die hier besprochenen Kopierfunktionalitäten
    Das wäre dann nicht objektorientiert. Jedes Objekt sollte wissen, wann was zu kopieren ist und das dann in eine List / Queue werfen.
    Am anderen Ende arbeitet dann der Kopierthread, der weiß, wann ein { Source, Target } mit kopieren beschäftigt ist und erst dann kopiert, wenn Source und Target frei sind.
    Erstell Dir für solche "Updates" jeweils ein kleines separates Testprogramm, in dem Du die Funktionalität in sich entwickelst.
    Ist das fertig, integrierst Du das in Dein großes Programm. :thumbup:
    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!