Separater Thread, Form friert trotzdem

  • WPF

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    r0tzi schrieb:

    ist doch WPF ?!
    Nachdem es von Nofear23m verschoben wurde, weil ich dies gemeldet hatte.
    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!

    r0tzi schrieb:


    hier ein thread den ich in WPF auf gemacht habe, wo ich die hucke voll bekommen habe weils keinen direkten bezug zu WPF hatte...
    Datatable nur 4500 Rows?


    Und, hat DataTable etwas mit WinForm, WPF oder Konsole zu tun? Nein, hat es nicht, es es völlig unabhängig von der Art der Umgebung.

    r0tzi schrieb:


    hier, was eig auch kein direkten bezug zu WPF hat, da es eigentlich um separate threads geht, wird nun in WPF verschoben O_o


    Moment.. nachdenken, Form friert ein, FORM, was für eine Form, WinForm oder WPF? Ah WPF, dann gehört es wohin?
    Hallo,

    ja, ich weis. Ist ein wenig doof aber gewisse Dinge funktionieren unter WinForms anders als unter WPF. Das Threading bzw. Invoke ist eines dieser Dinge.
    DataTables und der gleichen kommen eigendlich aus der WinForms Welt und finden unter WPF so gut wie keine Verwendung. Deshalb die verwirrung.

    War ja auch nicht Böse gemeint. Jetzt ists ja an richtiger stelle.

    da du leider nicht mit Binding arbeitest so wie es in der WPF Welt gehört kann ich dir nur leider an der stelle nicht wirklich weiterhelfen. Ist wieder nicht Böse gemeint, aber ich bekomme bei dem Code in Verbindung mit WPF ein wenig Gänsehaut. Vieleicht kann dir hier jemand Helfen, ansonsten muss ich mich daran versuchen, aber vieleicht kann dir eh jemand helfen, mir fehlt nur im Moment die Zeit mir dessen anzunehmen. Sorry ;(

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,

    da du leider nicht mit Binding arbeitest so wie es in der WPF Welt gehört
    das ist so nicht ganz richtig, ich arbeite auch mit bindings, aber nicht alles ja weil ich es einfach noch nicht verstehe. Leider habe ich hier etwas zeitdruck und deshalb pfrimel ich es erstmal so hin dass es funktioniert. "Schöner machen, Funktioneller machen", kann ich es dann immernoch.

    @Nofear23m seit dem du mir dataview gezeigt hast, arbeite ich nur noch mit dem, oder den listview fülle ich auch mit observable collection etc... aber wie gesagt im Moment ebenfalls zeit zeit zeit.. nun, generell funktionier es ja was ich gemacht habe, NUR gehört es eben nicht so ;)

    edit: @RodFromGermany
    Umgebung ist WPF falls das ne rolle spielt...
    habs im ersten post genannt :/

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

    Die Basis, dass ich mit Statuszeile und statusbar arbeiten konnte, hatte mir @Nofear23m hier mit einem VB.Net Beispiel gezeigt.
    Das habe ich mir dann weiter aufgebaut. Ab hier dann alles in C#, weil ich ja nicht in VB.Net programmiere.

    Nachtrag: Funktionsnamen geändert, @Nofear23m hat zu Recht den Namen moniert.

    WorkerViewModel (Teilauszug)
    Spoiler anzeigen

    C#-Quellcode

    1. private CancellationTokenSource tokenSource;
    2. private StatusBarViewModel _statusbar;
    3. private async void MachWas(object obj)
    4. {
    5. int i = 0;
    6. // The Progress<T> constructor captures our UI context,
    7. // so the lambda will be run on the UI thread.
    8. var progress = new Progress<double>(percent =>
    9. {
    10. NewProgressToSet = percent;
    11. });
    12. // DoProcessing is run on the thread pool.
    13. tokenSource = new CancellationTokenSource();
    14. var token = tokenSource.Token;
    15. await Task.Run(() =>
    16. {
    17. i = AufrufWorkerFunktion(Param1, Param2, token, progress);
    18. });
    19. if (token.IsCancellationRequested)
    20. {
    21. //mach was
    22. return;
    23. }
    24. // hier weiter im Ablauf der Funktion
    25. }


    Klasse, in welcher die zeitintensive Arbeit erledigt wird, hier nur die abgespeckte Funktion
    Spoiler anzeigen

    C#-Quellcode

    1. internal static int AufrufWorkerFunktion(string Param1, string Param2, CancellationToken token, IProgress<double> progress)
    2. {
    3. int CounterBisItem = 0;
    4. double HighestPercentageReached = 0d;
    5. progress.Report(0d);
    6. // eigentliche Verarbeitungslauf (Loop, Whatever)
    7. #region " Asyncrone Prozesse Nachrichten"
    8. double percent = (double)((float)CounterBisItem * 100 / (float)AlleItems);
    9. if (percent > HighestPercentageReached)
    10. {
    11. HighestPercentageReached = percent;
    12. if (progress != null)
    13. progress.Report(percent);
    14. }
    15. if (token.IsCancellationRequested)
    16. break;
    17. #endregion " Asyncrone Prozesse Nachrichten"
    18. }


    Ich hoffe es zeigt auf, wie der progress übermittelt wird, zusätzlich kannst Du auf Abbruch reagieren, der natürlich über andere Commands erst implementiert sein muss, damit ein Benutzer überhaupt abbrechen kann.

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

    Hallo

    Du rufst die Prozedur AufrufAsyncFunktion Asyncron auf obwohl diese nicht mit async gekennzeichnet ist?
    Warum heißt die berhaupt AufrufAsyncFunktion. Ist sie ja nicht. Deshalb wir dir die GUI auch einfrieren.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich habe hier extrem viel Code abgespeckt um ein Beispiel zu liefern, meine eigentliche "WorkerFunktion" ist halt in einer anderen Klasse ausgelagert.
    Gut, Du hast Recht damit, dass der Name falsch gewählt ist für das Beispiel, mea culpa.
    Aber: Dann musst du mir aber erklären, warum meine Funktion eben nicht einfriert? Tut sie definitiv nicht. Laufzeit liegt im Minuten bereich, ich kann die Form bewegen und auch Abbrechen (mit entsprechendem Command).

    Dksksm schrieb:

    Dann musst du mir aber erklären, warum meine Funktion eben nicht einfriert?

    Weil das nur in dem Context funktioniert das die Methode von "MachWas" aufgerufen wird. Woanders funktioniert das eben nicht. Auch wenn "MachWas" vom Contructor aufgerufen wir, wird das wohl nicht klappen.
    Ich wollte nur darauf hinweisen das die Methode bitte umzubenennen wäre. Und die Methode ansicht eben nicht Asyncron ist und die Form (window) einfriert. Ausser in dem Context wie in "MachWas", aber der Context muss ja nicht immer gegeben sein.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Die Methode selbst ist korrekterweise nicht asynchron, was auch nicht notwendig ist, das stimmt schon, hatte ich auch bestätigt.
    Puh aber gerade bei solchen komplexen Zusammenhängen ist ja der gesamte Prozess für das Funktionieren entscheidend.
    Die Methode "MachWas" ist dafür natürlich entscheidend. Dazu kann man sich aber auch die mehr als ausreichend vorhandene Literatur im Internet zu "await Task.Run" durchlesen.

    Nachtrag: Beitrag Separater Thread, Form friert trotzdem überarbeitet.