Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De AsyncRelayCommand en AsyncRelayCommand<T> zijn ICommand implementaties die de functies uitbreiden die worden aangeboden door RelayCommand, met ondersteuning voor asynchrone bewerkingen.
Platform-API's:
AsyncRelayCommand,AsyncRelayCommand<T>,RelayCommand, ,IAsyncRelayCommandIAsyncRelayCommand<T>
Hoe ze werken
AsyncRelayCommand en AsyncRelayCommand<T> de volgende belangrijke functies hebben:
- Ze breiden de functionaliteit van de synchrone commando’s in de bibliotheek uit, met ondersteuning voor delegates die
Taskretourneren. - Ze kunnen asynchrone functies verpakken met een extra
CancellationTokenparameter ter ondersteuning van annuleren en ze maken eenCanBeCanceledenIsCancellationRequestedeigenschappen beschikbaar, evenals eenCancelmethode. - Ze maken een
ExecutionTaskeigenschap beschikbaar die kan worden gebruikt om de voortgang van een in behandeling zijnde bewerking te controleren en eenIsRunningeigenschap die kan worden gebruikt om te controleren wanneer een bewerking is voltooid. Dit is met name handig om een opdracht te binden aan UI-elementen, zoals het laden van indicatoren. - Ze implementeren de
IAsyncRelayCommandenIAsyncRelayCommand<T>interfaces, wat betekent dat viewmodel eenvoudig opdrachten beschikbaar kan maken met behulp van deze om de strakke koppeling tussen typen te verminderen. Dit maakt het bijvoorbeeld eenvoudiger om een opdracht te vervangen door een aangepaste implementatie die hetzelfde openbare API-oppervlak beschikbaar maakt, indien nodig.
Werken met asynchrone opdrachten
Stel dat een scenario vergelijkbaar is met het scenario dat in het RelayCommand voorbeeld wordt beschreven, maar een opdracht die een asynchrone bewerking uitvoert:
public class MyViewModel : ObservableObject
{
public MyViewModel()
{
DownloadTextCommand = new AsyncRelayCommand(DownloadText);
}
public IAsyncRelayCommand DownloadTextCommand { get; }
private Task<string> DownloadText()
{
return WebService.LoadMyTextAsync();
}
}
Met de gerelateerde UI-code:
<Page
x:Class="MyApp.Views.MyPage"
xmlns:viewModels="using:MyApp.ViewModels"
xmlns:converters="using:Microsoft.Toolkit.Uwp.UI.Converters">
<Page.DataContext>
<viewModels:MyViewModel x:Name="ViewModel"/>
</Page.DataContext>
<Page.Resources>
<converters:TaskResultConverter x:Key="TaskResultConverter"/>
</Page.Resources>
<StackPanel Spacing="8" xml:space="default">
<TextBlock>
<Run Text="Task status:"/>
<Run Text="{x:Bind ViewModel.DownloadTextCommand.ExecutionTask.Status, Mode=OneWay}"/>
<LineBreak/>
<Run Text="Result:"/>
<Run Text="{x:Bind ViewModel.DownloadTextCommand.ExecutionTask, Converter={StaticResource TaskResultConverter}, Mode=OneWay}"/>
</TextBlock>
<Button
Content="Click me!"
Command="{x:Bind ViewModel.DownloadTextCommand}"/>
<ProgressRing
HorizontalAlignment="Left"
IsActive="{x:Bind ViewModel.DownloadTextCommand.IsRunning, Mode=OneWay}"/>
</StackPanel>
</Page>
Wanneer u op de Button klikt, wordt de opdracht uitgevoerd en wordt de ExecutionTask bijgewerkt. Wanneer de bewerking is voltooid, genereert de eigenschap een melding die wordt weergegeven in de gebruikersinterface. In dit geval worden zowel de taakstatus als het huidige resultaat van de taak weergegeven. Als u het resultaat van de taak wilt weergeven, is het noodzakelijk om de TaskExtensions.GetResultOrDefault methode te gebruiken. Dit biedt toegang tot het resultaat van een taak die nog niet is voltooid zonder de thread te blokkeren (en mogelijk een impasse veroorzaakt).
Examples
- Bekijk de voorbeeld-app (voor meerdere UI-frameworks) om de MVVM Toolkit in actie te zien.
- U vindt ook meer voorbeelden in de eenheidstests.