AsyncRelayCommand ve AsyncRelayCommand<T>

AsyncRelayCommand ve AsyncRelayCommand<T>, eşzamansız işlemleri destekleyerek RelayCommand tarafından sunulan işlevleri genişleten ICommand uygulamalarıdır.

Platform API'leri:AsyncRelayCommand, AsyncRelayCommand<T>, RelayCommand, IAsyncRelayCommand, IAsyncRelayCommand<T>

Nasıl çalışırlar?

AsyncRelayCommand ve AsyncRelayCommand<T> aşağıdaki ana özelliklere sahiptir:

  • Bunlar, kitaplıkta bulunan eşzamanlı komutların işlevselliğini, Task döndüren temsilciler desteğiyle genişletir.
  • Zaman uyumsuz işlevleri iptali desteklemek için ek CancellationToken bir parametreyle sarmalayabilir ve bir CanBeCanceled ve IsCancellationRequested özelliklerinin yanı sıra bir Cancel yöntemi de kullanıma sunarlar.
  • Bekleyen bir işlemin ilerlemesini izlemek için kullanılabilecek bir ExecutionTask özelliği ve bir işlemin ne zaman tamamlandığını kontrol etmek için kullanılabilecek bir IsRunning sağlarlar. Bu, özellikle yükleme göstergeleri gibi kullanıcı arabirimi öğelerine bir komut bağlamak için yararlıdır.
  • IAsyncRelayCommand ve IAsyncRelayCommand<T> arabirimlerini uygularlar; bu da görünüm modelinin, türler arasındaki sıkı bağlamayı azaltmak için bunları kullanarak komutları kolayca sunabilmesi anlamına gelir. Örneğin bu, gerekirse bir komutun aynı genel API yüzeyini ortaya çıkararak özel bir uygulamayla değiştirilmesini kolaylaştırır.

Zaman uyumsuz komutlarla çalışma

Örnekte açıklanana RelayCommand benzer bir senaryoyu ancak zaman uyumsuz bir işlemi yürüten bir komut olduğunu düşünelim:

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

    public IAsyncRelayCommand DownloadTextCommand { get; }

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

İlgili kullanıcı arayüzü koduyla:

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

öğesine tıklandığında Buttonkomutu çağrılır ve ExecutionTask güncelleştirilir. İşlem tamamlandığında özelliği, kullanıcı arabirimine yansıtılan bir bildirim oluşturur. Bu durumda hem görev durumu hem de görevin geçerli sonucu görüntülenir. Görevin sonucunu görüntülemek için TaskExtensions.GetResultOrDefault yönteminin kullanılmasının gerekli olduğunu unutmayın; bu yöntem, iş parçacığını engellemeden (ve muhtemelen bir kilitlenmeye yol açmadan) henüz tamamlanmamış bir görevin sonucuna erişim sağlar.

Örnekler