AsyncRelayCommand en AsyncRelayCommand<T>

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 CancellationToken parameter ter ondersteuning van annuleren en ze maken een CanBeCanceled en IsCancellationRequested eigenschappen beschikbaar, evenals een Cancel methode.
  • Ze maken een ExecutionTask eigenschap beschikbaar die kan worden gebruikt om de voortgang van een in behandeling zijnde bewerking te controleren en een IsRunning eigenschap 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 IAsyncRelayCommand en IAsyncRelayCommand<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.