Sdílet prostřednictvím


AsyncRelayCommand a AsyncRelayCommand<T>

ICommand AsyncRelayCommand<T> ImplementaceAsyncRelayCommand, které rozšiřují funkce, které RelayCommandnabízí , s podporou asynchronních operací.

Rozhraní API platformy: AsyncRelayCommand, AsyncRelayCommand<T>RelayCommand, , IAsyncRelayCommand,IAsyncRelayCommand<T>

Jak fungují

AsyncRelayCommand a AsyncRelayCommand<T> mají následující hlavní funkce:

  • Rozšiřují funkce synchronních příkazů obsažených v knihovně s podporou Taskvrácení delegátů.
  • Můžou zabalit asynchronní funkce s dalším CancellationToken parametrem, který podporuje zrušení, a zpřístupňují a CanBeCanceled IsCancellationRequested vlastnosti a také metodu Cancel .
  • Zpřístupňují ExecutionTask vlastnost, která se dá použít ke sledování průběhu čekající operace a IsRunning která se dá použít ke kontrole, kdy se operace dokončí. To je zvlášť užitečné pro vazbu příkazu k prvkům uživatelského rozhraní, jako jsou například indikátory načítání.
  • Implementují IAsyncRelayCommand rozhraní a IAsyncRelayCommand<T> rozhraní, což znamená, že model viewmodel může pomocí těchto příkazů snadno vystavit příkazy, které snižují úzkou vazbu mezi typy. To například usnadňuje nahrazení příkazu vlastní implementací, která v případě potřeby zveřejní stejnou veřejnou plochu rozhraní API.

Práce s asynchronními příkazy

Představme si scénář podobný tomu, který je popsaný v RelayCommand ukázce, ale příkaz, který spouští asynchronní operaci:

public class MyViewModel : ObservableObject
{
    public MyViewModel()
    {
        DownloadTextCommand = new AsyncRelayCommand(DownloadText);
    }

    public IAsyncRelayCommand DownloadTextCommand { get; }

    private Task<string> DownloadText()
    {
        return WebService.LoadMyTextAsync();
    }
}

Související kód uživatelského rozhraní:

<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>

Po kliknutí na Buttonpříkaz se vyvolá a ExecutionTask aktualizuje se. Po dokončení operace vyvolá vlastnost oznámení, které se projeví v uživatelském rozhraní. V tomto případě se zobrazí stav úkolu i aktuální výsledek úkolu. Všimněte si, že chcete-li zobrazit výsledek úkolu, je nutné použít metodu TaskExtensions.GetResultOrDefault - to poskytuje přístup k výsledku úkolu, který ještě nebyl dokončen bez blokování vlákna (a pravděpodobně způsobuje zablokování).

Příklady

  • Podívejte se na ukázkovou aplikaci (pro více architektur uživatelského rozhraní) a podívejte se na sadu nástrojů MVVM v akci.
  • Další příklady najdete také v testech jednotek.