Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
ICommand AsyncRelayCommand<T> ImplementaceAsyncRelayCommand, které rozšiřují funkce, které RelayCommandnabízí , s podporou asynchronních operací.
Rozhraní API platformy:
AsyncRelayCommand,AsyncRelayCommand<T>RelayCommand, ,IAsyncRelayCommand,IAsyncRelayCommand<T>
Jak fungují
AsyncRelayCommand a AsyncRelayCommand<T> mají následující hlavní funkce:
- Rozšiřují funkce synchronních příkazů obsažených v knihovně s podporou
Taskvrácení delegátů. - Můžou zabalit asynchronní funkce s dalším
CancellationTokenparametrem, který podporuje zrušení, a zpřístupňují aCanBeCanceledIsCancellationRequestedvlastnosti a také metoduCancel. - Zpřístupňují
ExecutionTaskvlastnost, která se dá použít ke sledování průběhu čekající operace aIsRunningkterá se dá použít ke kontrole, kdy se operace dokončí. To je zvlášť užitečné pro vazbu příkazu k prvkům uživatelského rozhraní, jako jsou například indikátory načítání. - Implementují
IAsyncRelayCommandrozhraní aIAsyncRelayCommand<T>rozhraní, což znamená, že model viewmodel může pomocí těchto příkazů snadno vystavit příkazy, které snižují úzkou vazbu mezi typy. To například usnadňuje nahrazení příkazu vlastní implementací, která v případě potřeby zveřejní stejnou veřejnou plochu rozhraní API.
Práce s asynchronními příkazy
Představme si scénář podobný tomu, který je popsaný v RelayCommand ukázce, ale příkaz, který spouští asynchronní operaci:
public class MyViewModel : ObservableObject
{
public MyViewModel()
{
DownloadTextCommand = new AsyncRelayCommand(DownloadText);
}
public IAsyncRelayCommand DownloadTextCommand { get; }
private Task<string> DownloadText()
{
return WebService.LoadMyTextAsync();
}
}
Související kód uživatelského rozhraní:
<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>
Po kliknutí na Buttonpříkaz se vyvolá a ExecutionTask aktualizuje se. Po dokončení operace vyvolá vlastnost oznámení, které se projeví v uživatelském rozhraní. V tomto případě se zobrazí stav úkolu i aktuální výsledek úkolu. Všimněte si, že chcete-li zobrazit výsledek úkolu, je nutné použít metodu TaskExtensions.GetResultOrDefault - to poskytuje přístup k výsledku úkolu, který ještě nebyl dokončen bez blokování vlákna (a pravděpodobně způsobuje zablokování).
Příklady
- Podívejte se na ukázkovou aplikaci (pro více architektur uživatelského rozhraní) a podívejte se na sadu nástrojů MVVM v akci.
- Další příklady najdete také v testech jednotek.