다음을 통해 공유


AsyncRelayCommand 및 AsyncRelayCommand<T>

AsyncRelayCommand ICommand AsyncRelayCommand<T> 비동기 작업을 지원하여 제공하는 RelayCommand기능을 확장하는 구현입니다.

플랫폼 API: AsyncRelayCommand, AsyncRelayCommand<T>, RelayCommand, IAsyncRelayCommandIAsyncRelayCommand<T>

작동 방식

AsyncRelayCommand 다음과 AsyncRelayCommand<T> 같은 주요 기능이 있습니다.

  • 반환 대리자를 지원 Task하여 라이브러리에 포함된 동기 명령의 기능을 확장합니다.
  • 취소를 지원하기 위해 추가 CancellationToken 매개 변수를 사용하여 비동기 함수를 래핑할 수 있으며 메서드뿐만 아니라 Cancel a CanBeCanceledIsCancellationRequested 속성을 노출할 수 있습니다.
  • 보류 중인 작업의 진행률을 모니터링하는 데 사용할 수 있는 속성과 IsRunning 작업이 완료되는 시기를 확인하는 데 사용할 수 있는 속성을 노출 ExecutionTask 합니다. 이는 표시기 로드와 같은 UI 요소에 명령을 바인딩하는 데 특히 유용합니다.
  • 이는 viewmodel이 이를 사용하여 명령을 쉽게 노출하여 형식 간의 긴밀한 결합을 줄일 수 있음을 의미하는 인터페이스 및 IAsyncRelayCommand<T> 인터페이스를 구현 IAsyncRelayCommand 합니다. 예를 들어 필요한 경우 명령을 동일한 공용 API 표면을 노출하는 사용자 지정 구현으로 쉽게 바꿀 수 있습니다.

비동기 명령 작업

샘플에 RelayCommand 설명된 시나리오와 비슷하지만 비동기 작업을 실행하는 명령을 생각해 보겠습니다.

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

    public IAsyncRelayCommand DownloadTextCommand { get; }

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

관련 UI 코드 사용:

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

클릭하면 Button명령이 호출되고 ExecutionTask 업데이트됩니다. 작업이 완료되면 속성은 UI에 반영되는 알림을 발생합니다. 이 경우 작업 상태와 작업의 현재 결과가 모두 표시됩니다. 작업의 결과를 표시하려면 메서드를 사용해야 TaskExtensions.GetResultOrDefault 합니다. 이렇게 하면 스레드를 차단하지 않고(교착 상태가 발생할 수 있음) 아직 완료되지 않은 작업의 결과에 액세스할 수 있습니다.

예제

  • 샘플 앱(여러 UI 프레임워크의 경우)을 확인하여 작동 중인 MVVM 도구 키트를 확인합니다.
  • 단위 테스트에서 더 많은 예제를 찾을 수도 있습니다.