Aracılığıyla paylaş


AsyncRelayCommand ve AsyncRelayCommand<T>

AsyncRelayCommand veAsyncRelayCommand<T>, ICommand tarafından RelayCommandsunulan işlevleri zaman uyumsuz işlemler için destekle genişleten uygulamalardı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ığa dahil edilen zaman uyumlu komutların işlevlerini, geri dönen temsilciler için Taskdestekle 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 ExecutionTask işlemin ilerleme durumunu izlemek için kullanılabilecek bir özelliği ve IsRunning bir işlemin ne zaman tamamlandığını denetlemek için kullanılabilecek bir özelliği kullanıma sunar. Bu, özellikle yükleme göstergeleri gibi kullanıcı arabirimi öğelerine bir komut bağlamak için yararlıdır.
  • ve IAsyncRelayCommand<T> arabirimlerini uygularlarIAsyncRelayCommand, yani görünüm modeli, türler arasındaki sıkı bağlamayı azaltmak için bunları kullanarak komutları kolayca kullanıma açabilir. Ö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ı arabirimi 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östermek için yönteminin kullanılması TaskExtensions.GetResultOrDefault gerekli olduğunu unutmayın; bu, iş parçacığını engellemeden (ve kilitlenmeye neden olabilir) henüz tamamlanmamış bir görevin sonucuna erişim sağlar.

Örnekler