AsyncRelayCommand 및 AsyncRelayCommand<T>
AsyncRelayCommand
ICommand
AsyncRelayCommand<T>
비동기 작업을 지원하여 제공하는 RelayCommand
기능을 확장하는 구현입니다.
플랫폼 API:
AsyncRelayCommand
,AsyncRelayCommand<T>
,RelayCommand
,IAsyncRelayCommand
IAsyncRelayCommand<T>
작동 방식
AsyncRelayCommand
다음과 AsyncRelayCommand<T>
같은 주요 기능이 있습니다.
- 반환 대리자를 지원
Task
하여 라이브러리에 포함된 동기 명령의 기능을 확장합니다. - 취소를 지원하기 위해 추가
CancellationToken
매개 변수를 사용하여 비동기 함수를 래핑할 수 있으며 메서드뿐만 아니라Cancel
aCanBeCanceled
및IsCancellationRequested
속성을 노출할 수 있습니다. - 보류 중인 작업의 진행률을 모니터링하는 데 사용할 수 있는 속성과
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 도구 키트를 확인합니다.
- 단위 테스트에서 더 많은 예제를 찾을 수도 있습니다.
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
MVVM Toolkit