Diskuze: Instance a Garbage collector
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tip cislo dve je, ze mi to bezi v UI threadu ta instance ze ktere hraje radio a nic nehraje, protoze to blokuje to UI. V tom pripade nemam uz vubec tuseni jak s tim nalozit
Co si tu instanci udržovat normálně u jaký hlavní herní třídy po celou dobu?
NO a kde tu instanci mas vytvorenou? Kdyz myslis, ze ti to sezere GC, tak by bylo fajn ukazat, kde se ta instance vytváří,.. ale předem říkám, že je to super nepravděpodobný
Uz vyreseno, nevim, jestli to je nejcistsi reseni ale bylo to tim, ze jakmile se zaplo WPF okno, blokoval ten MediaPlayer onen UI thread.
Jinak instanci sem tvoril primo v konstruktoru MainWindow (WPF).
Tohle pomohlo:
Thread rManagerThread = new Thread(() =>
{
this.rm = new RadioManager();
System.Windows.Threading.Dispatcher.Run();
});
rManagerThread.SetApartmentState(ApartmentState.STA);
rManagerThread.IsBackground = true;
rManagerThread.Name = "RadioManager";
rManagerThread.Start();
Konkretne to zachranil
System.Windows.Threading.Dispatcher.Run();
Coz me trosku mate, proc je to vytvoreni noveho Dispatcheru v tom vlakne tak "kriticke", aby se to neblokovalo s UI threadem
MediaPlayer dědí z Dispatcher object, to znamená, že potřebuje aktivovaný message pumping (jakmile je vyvolán ten event, je umístěn do MSG queue a předán vláknu, které vytvořilo MediaPlayer, aby ten event vykonalo. Jenomže tvoje nové vlákno tento message pumping neprovádí, dokud právě nezavoláš Dispatcher.Run().
Pokud to nezavoláš, tak by se měl MediaPlayer zavřít (stejně jako kdybys vytvořil třeba Window na vedlejším vlákně), právě proto, že není aktivní Dispatcher, takže vlákno prostě skončí.
Zobrazeno 7 zpráv z 7.