Laden...

Events feuern nicht auf jedem PC

Erstellt von Kriz vor 3 Jahren Letzter Beitrag vor 3 Jahren 378 Views
K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 3 Jahren
Events feuern nicht auf jedem PC

Guten morgen zusammen,

folgende Situation:
Ich habe eine kleine Jukebox entwickelt. Der User gibt in einem Import-Fenster die Location der MP3 Files an und die Jukebox speichert Titel, Interpret, Album und Pfad zur MP3 in einer internen Datenbank.
Nach jedem "importiertem" File wird ein Event gefeuert um den User anzuzeigen wie der Fortschritt ist:

Event:

public static event EventHandler<string> onSongAdded;
protected virtual void OnSongAddedRais(string e)
        {
            EventHandler<string> raiseEvent = onSongAdded;
            if (raiseEvent != null)
            {
                raiseEvent(this, e);
            }
        }

Und hier wird es ausgelöst:

private void SaveMP3ToDatabase(string path)
        {
            var tfile = TagLib.File.Create(path);
            
            Song song = new Song()
            {
                Title = tfile.Tag.Title,
                Interpret = GetInterpretOrCreateNew(tfile.Tag.Performers[0]),
                Album = GetAlbumOrCreateNew(tfile, path),
                Location = path,
                Duration = tfile.Properties.Duration
            };
            song.Album.Tracklist.Add(song);
            CurrentImportedSong = song;
            CheckAndSaveSongs(song);
            db.Albums.AddOrUpdate(song.Album);
            db.SaveChanges();
            OnSongAddedRais($"{song.Interpret.Name} - {song.Title}");
        }

Und hier wird es abboniert:

ImportMP3.onSongAdded += AssignTitle;

Mein Problem ist nun folgendes:
Auf meinem Entwickler PC und auf einem zweiten PC, den ich zuhause habe, funktioniert das feuern der Events ohne Probleme, die UI zeigt immer den aktuell importierten Titel an. Und alle Titel werden korrekt importiert.
Auf dem Kunden PC werden die Events anscheinend aber nicht ausgelöst. An der UI tut sich nichts, aber der Import erfolgt.
Kurioserweise tritt das Problem nur an dieser Stelle auf, denn an vielen anderen Stellen in der Software arbeite ich erfolgreich mit Events, nur hier wollen sie nicht, wie sie sollen.
Woran kann das liegen?

Vielen Dank im Vorraus!
Kriz

F
10.010 Beiträge seit 2004
vor 3 Jahren

Machst du das evtl in einem Task oder ( wenn ich nach dem EventHandler gehe ) in einem BackgroundWorker?

Ich hätte ja eher INotifyPropertyChanged implementiert.

4.942 Beiträge seit 2008
vor 3 Jahren

Wird die Methode SaveMP3ToDatabase denn aus dem Main UI-Thread heraus aufgerufen? Oder hast du die Exception per Control.CheckForIllegalCrossThreadCalls = false unterdrückt? Dann s. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

PS: WinForms oder WPF?

K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 3 Jahren

@FZelle
Also die UI wird an ein ViewModel gebunden und dieses instanziert die Klasse MP3Import
In einem Task wird dann die Funktion Import der Klasse MP3Import aufgerufen.

@TH69
das ist WPF
Die Methode SaveMP3ToDatabase wird nicht im UI Thread aufgerufen, habe aber auch keine Exception unterdrückt.

Wie gesagt, sowohl bei mir auf dem Rechner, als auch auf einem zweiten Rechner funktioniert alles einwandfrei, nur eben auf dem Kunden PC nicht.

4.942 Beiträge seit 2008
vor 3 Jahren

OK, bei WPF mußt du zwingend den Dispatcher dafür benutzen, s. obigen FAQ-Beitrag ("Wie geht es in WPF?").

Nur weil es bei dir (zufällig) funktioniert, heißt ja nicht, daß es korrekt ist.

5.658 Beiträge seit 2006
vor 3 Jahren

Du solltest dir auch mal [Artikel] MVVM und DataBinding anschauen. Wenn man DataBinding verwendet, dann kann man weitestgehend auf Events verzichten, und man muß sich auch keine Sorgen machen, in welchem Thread was ausgeführt wird.

Und auch Datenbank-Operationen haben nichts in der UI verloren. Siehe dazu [Artikel] Drei-Schichten-Architektur

Wenn du das beruflich machst, solltest du dich mal mit den Grundlagen der Software-Entwicklung auseinandersetzen. Sonst wirst du immer wieder von einem "kuriosen" Problem zum anderen stolpern.

Weeks of programming can save you hours of planning