Treść książki
Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
2040Wątkiroboczeiwspółdzielonydostępdokomponentówinterfejsuużytkownika
Listing2.4.AsynchronicznawersjametodyPerformCalculations
privateasyncvoidButtonCalculatePi_Click(objectsender,
RoutedEventArgse)
{
try
{
longpointsCount=GetPoints();
47
if(pointsCount==0)
{
awaitDisplayError("Podajprawidłowąliczbępunktów");
}
else
{
PerformCalculationsAsync(pointsCount);
}
}
catch(Exceptionex)
{
awaitDisplayError(ex.Message);
}
}
privateasyncvoidPerformCalculationsAsync(longpointsCount)
{
awaitTask.Run(()=>PerformCalculations(pointsCount));
}
Jednakżepouruchomieniutakzmodyfkowanejaplikacjiszybkookażesię,że
funkcjawątkuroboczegoniemożeaktualizowaćzawartościlistywyników.Jestto
sygnalizowanewyjątkiemtypuSystem.Exceptionotreści:Aplikacjawywołałainter-
fejs,któryzostałskierowanynainnywątek.(ExceptionfromHRESULT:0x8001010E
(RPC_E_WRONG_THREAD)).Treśćtegowyjątkuwynikazfaktu,żewszystkiekompo-
nentyinterfejsuużytkownikanależądowątkugłównegoaplikacji,wramachktórego
zostałyutworzone.Ztegopowodupróbaaktualizacjiichstanuzpoziomufunkcji
wątkówroboczychkończysięniepowodzeniem.
Rozwiązaniepowyższegoproblemudostarczaklasa
CoreDispatcher
,która
obsługujewszystkiezdarzeniawystępującewaplikacjiUWP
.Innymisłowy,klasa
CoreDispatcher
implementujepętlęgłównąaplikacji(wątkugłównego),która
czekanażądaniagenerowaneprzezpozostałeelementyaplikacji,będącezazwyczaj
zdarzeniamigenerowanymiprzezużytkownika(kliknięciedowolnegokomponentu
wizualnego,wskazaniejednejzopcjipolawyboru),lub,jakwpowyższymprzykła-
dzie,żądanieaktualizacjistanulistywyników.ŻądaniawysyłanedoklasyCore-
Dispatcher
sąnastępnieprzetwarzanesynchronicznie,zgodniezmodelemASTA.
Dlategoteżpróbasamodzielnejedycjilistyzpoziomuwątkuroboczegozakończyła
sięniepowodzeniem.