Ovaj naslov predstavlja III dio u seriji postova oko .NET i Windows 7. Prvi i drugi dio govore o windows taskbaru odnosno podršci za senzore.
Kao software developer nerijetko ste suočeni sa situacijom kada se aplikacija sruši ili zaglavi iz nepoznatog razloga,i ne možete je nikakvim konvencijonalnim metodama ubjediti da sačuva podatke ili da se zatvori. U situacijama kada se iz nepoznatog razloga ovo desi, najviše stradaju podatci koje obrađuje aplikacija i oni se nepovratno izgube.
Šta uraditi i takvim situacijama? Imamo dvije opcije:
1. Moliti se da do toga ne dođe.
2. Koristiti novo proširenje Windows 7 ARR, (koje u stvari se pojavilo izlaskom Viste).
ARR proširenje uključeno je u API Code Pack, i na vrlo jednostavan način ga možemo koristiti na našim aplikacijama. Procedura korištenja ARR je sljedeća:
1. Registracija na ARR
2. Implementacija Recovery metode
3. Skidanje sa ARR
Ova tri koraka dovoljna su za potpunu implementaciju ARR sistema.
Registrirati se na ARR, jednostavna je operacija i potrebno ju je postaviti na samom početku životnog vijeka aplikacije, odnosno tamo gdje prije toga se ne bi terebala desiti nikakva ne očekivana situacija da nam aplikacija padne. To su uglavnom metode inicijalizacije mainwindow objekta. Registracija se vrši posebno na Recovery a posebno na Restart.
private static void RegisterApplicationRecoveryAndRestart() { if (!CoreHelpers.RunningOnVista && !CoreHelpers.RunningOnWin7) return; // register for Application Restart RestartSettings restartSettings = new RestartSettings(string.Empty, RestartRestrictions.None); ApplicationRestartRecoveryManager.RegisterForApplicationRestart(restartSettings); // register for Application Recovery RecoverySettings recoverySettings = new RecoverySettings(new RecoveryData(PerformRecovery, null), 0); ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(recoverySettings); }
Gornja metoda predstavlja registraciju na Restart, odnosno tražimo od ARR da naša aplikacija izvrši restartovanje u svim slučajevima neželjenog pada, osim u slučajevima kada se vrši reboot sistema ili kada se instalira određeni patch (zakrpa). Situacije u kojima želimo specificirati kad izvršiti restart definišemo enumeracijom RestartRestrictions, koja ima sljedeće vrijednosti:
Restrikcija | Značenje |
None | bez restrikcija |
NotOnCrash | ne restartuj proces u koliko se radi o neobrađenom izuzetku. |
NotOnHang | ne restartuj proces u koliko se radi o nereagovanju aplikacija (no responding). |
NotOnPatch | ne restartuj proces u koliko se radi o instalaciji updejta. |
NotOnReboot | ne restartuj proces u koliko se radi o restartovanju OS-a uslijed instalacije updejta |
Registracija na Recovery definiše metodu za procesuiranje u neočekivanim situacijama (PerformRecovery) te vremenski interval. U biti ako aplikacija treba restart potrebno je definisati metodu koja će poslije restarta aplikaciji izvršiti postavke u priješnje stanje.
Recovery metoda
private static int PerformRecovery(object parameter) { try { ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress(); // Save your work here for recovery Console.WriteLine("Spasavanje podataka"); ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true); } catch { ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(false); } return 0; }
Metodu za recovery porebno je pozivati konstantno u određenom periodu da bi ARR sistem bio svjestan da treba upravljati aplikacijom. Ovo se dešava kada se poziva: ApplicationRecoveryInProgress(); dok je na kraju potrebno zuavršiti recovery proces. U koliko bi se desila nekakva neočekivana situacija potrebno je uvijek je dobro postaviti ove raqdnje u try catch blok, te u catch završavati proces za fals argumentom koji ARR sistemu daje do znanja da recovery proces nije završio uspješno.
Deregistracija ili isključivanje sa ARR sistema je potrebno kada se aplikacija zatvara da bi se oslobodili resursi. Ovo postižemo sljedećim kodom:
ApplicationRestartRecoveryManager.UnregisterApplicationRestart(); ApplicationRestartRecoveryManager.UnregisterApplicationRecovery();
U narednom dijelu prikazat ćemo demo sa prezentiranim svojstvima ARR sistema.
1. Otvorite VS2010 formirajte novi WindowsForms projekat.
2. Referencirate API Code pack (vidi prethodne blog postove)
3. Postavite jedno dugme na formu i definišite Click događaj.
Klik događaj implementiramo sljedećim kodom:
/// Rusenje aplikacije ///<span style="color: #222222; font-family: 'Courier 10 Pitch', Courier, monospace; line-height: 21px;"> </span>private void button1_Click(object sender, EventArgs e) { Environment.FailFast("ARR Demo intentional crash."); }
Sada je potrebno implemetirati ARR sistem. Kao što je prezentirano u prvom dijelu posta.
1. U Form1 konstruktoru registrujte ARR
2. U Closed događaju isključite se sa ARR događaja.
Implementacija recovery metode je prikazana na gornjim listingom.
Kada aplikacja padne, ARR sistem pokušava da izvrši recovery, pozivajući metodu PerformRecovery. Ova metoda pokušava da spasi sve relevantne podatke.
Kada smo sve implementirali Buildajte aplikaciju, te je locirate na disku. Pokrenite aplikaciju sa diska i kliknite na dugme za rušenje. Poslije izvjesnog vremena pojavljuje se poruke koju smo implementirali u recovery metodi da su naši podaci spašeni. U koliko sacekamo minutu i kliknemo na dugme nasa aplikacija ce se restartovati.
Recovery aplikacije
Restart aplikacije
Source code za ovaj primjer možete skinuti sa ovog linka.