Treść książki
Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
48
Programowanieasynchroniczne
SystemWindowstworzywyłączniejedenwątektypuASTA,którymjestwątekUI.
ProgramistaniemożesamodzielnieutworzyćkolejnegowątkuUIiwzwiązkuztym
wszelkieżądaniaaktualizacjistanukomponentówwizualnychmusząbyćrealizowane
zapośrednictwemklasy
CoreDispatcher
.Dotegoceluudostępniaonametodę
RunAsync
,copozwalauruchomićdowolnyfragmentkoduwramachwątkuUI.
Wszczególnościumożliwiatoaktualizacjęstanukomponentówwizualnych,coilu-
strujekolejnyprzykład,którywymagazmodyfkowaniazawartościplikuMainPage.
xaml.cswedługnastępującegoschematu:
1.Wnagłówkuplikuumieśćpolecenie
usingWindows.UI.Core;
2.Defnicjęklasy
MainPage
uzupełnijometodę
DisplayResult
(listing2.5).
3.WmetodziePerformCalculationszastąppolecenieListBoxResults.
Items.Add(result)wywołaniemmetodyDisplayResult(result)
(listingu2.6).
Listing2.5.Wysłanieżądaniaaktualizacjistanukomponentuwizualnego
privateasyncvoidDisplayResult(stringresult)
{
if(Dispatcher.HasThreadAccess)
{
ListBoxResults.Items.Add(result);
}
else
{
awaitDispatcher.RunAsync(CoreDispatcherPriority.Normal,
()=>DisplayResult(result));
}
}
Listing2.6.Bezpieczny(wsensiewielowątkowości)dostępdoelementówUI
privatevoidPerformCalculations(ulongpointsCount)
{
stopwatch.Restart();
doubleestimatedValue=MonteCarlo.EstimatePi(pointsCount);
stopwatch.Stop();
stringresult=PrepareResult(pointsCount,estimatedValue);
ListBoxResults.Items.Add(result);
DisplayResult(result);
}
Zasadniczymelementempowyższegokodusąpoleceniazlistingu2.5,któ-
rychzadaniemjestwysłanieżądaniaaktualizacjistanukontrolkiListBoxResults