AsyncRelayCommand
AsyncRelayCommand<T>
ICommand 비동기 작업을 지원하여 제공하는 RelayCommand기능을 확장하는 구현입니다.
플랫폼 API:
AsyncRelayCommand,AsyncRelayCommand<T>,RelayCommand,IAsyncRelayCommandIAsyncRelayCommand<T>
작동 방식
AsyncRelayCommand 다음과 AsyncRelayCommand<T> 같은 주요 기능이 있습니다.
-
Task를 반환하는 대리자를 지원하여 라이브러리에 포함된 동기 명령의 기능을 확장합니다. - 비동기 함수를 취소를 지원하는 추가적인
CancellationToken매개변수로 래핑할 수 있으며,CanBeCanceled및IsCancellationRequested속성과Cancel메서드를 노출합니다. - 이들은 대기 중인 작업의 진행 상황을 모니터링하는 데 사용할 수 있는
ExecutionTask속성과 작업이 완료되는 시점을 확인하는 데 사용할 수 있는IsRunning을 노출합니다. 이는 표시기 로드와 같은 UI 요소에 명령을 바인딩하는 데 특히 유용합니다. - 이들은
IAsyncRelayCommand및IAsyncRelayCommand<T>인터페이스를 구현하며, 이는 ViewModel이 이를 사용해 명령을 손쉽게 노출하고 형식 간의 강한 결합을 줄일 수 있음을 의미합니다. 예를 들어 필요한 경우 명령을 동일한 공용 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 도구 키트를 확인합니다.
- 단위 테스트에서 더 많은 예제를 찾을 수도 있습니다.
MVVM Toolkit