AsyncRelayCommand dan AsyncRelayCommand<T>

AsyncRelayCommand dan AsyncRelayCommand<T> adalah ICommand implementasi yang memperluas fungsionalitas yang ditawarkan oleh RelayCommand, dengan dukungan untuk operasi asinkron.

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

Cara kerjanya

AsyncRelayCommand dan AsyncRelayCommand<T> memiliki fitur utama berikut:

  • Mereka memperluas fungsionalitas perintah sinkron yang disertakan dalam pustaka, dengan dukungan untuk Taskdelegasi -returning.
  • Mereka dapat membungkus fungsi asinkron dengan parameter tambahan CancellationToken untuk mendukung pembatalan, dan mereka mengekspos CanBeCanceled properti dan IsCancellationRequested , serta Cancel metode.
  • Mereka mengekspos ExecutionTask properti yang dapat digunakan untuk memantau kemajuan operasi yang tertunda, dan IsRunning yang dapat digunakan untuk memeriksa kapan operasi selesai. Ini sangat berguna untuk mengikat perintah ke elemen UI seperti memuat indikator.
  • Mereka mengimplementasikan IAsyncRelayCommand antarmuka dan IAsyncRelayCommand<T> , yang berarti bahwa viewmodel dapat dengan mudah mengekspos perintah menggunakan ini untuk mengurangi kopling yang ketat di antara jenis. Misalnya, ini memudahkan untuk mengganti perintah dengan implementasi kustom yang mengekspos permukaan API publik yang sama, jika diperlukan.

Bekerja dengan perintah asinkron

Mari kita bayangkan skenario yang mirip dengan yang dijelaskan dalam RelayCommand sampel, tetapi perintah yang menjalankan operasi asinkron:

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

    public IAsyncRelayCommand DownloadTextCommand { get; }

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

Dengan kode UI terkait:

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

Setelah mengklik Button, perintah dipanggil, dan yang diperbarui ExecutionTask . Ketika operasi selesai, properti menaikkan pemberitahuan yang tercermin dalam UI. Dalam hal ini, status tugas dan hasil tugas saat ini ditampilkan. Perhatikan bahwa untuk menunjukkan hasil tugas, perlu menggunakan TaskExtensions.GetResultOrDefault metode - ini menyediakan akses ke hasil tugas yang belum selesai tanpa memblokir utas (dan mungkin menyebabkan kebuntuan).

Contoh