Bootstrap

【WPF】Prism学习(四)

Prism Commands

在这里插入图片描述

1.异步命令(Async Commands)

1.1. 命令作为事件处理器

  • 命令(Commands)实际上是一种事件处理器(EventHandler)。这意味着,如果一个命令被设计为异步执行,那么在命令还在执行的过程中,可能会被多次调用。

1.2. 异步任务中的命令调用

  • 特别地,在异步任务(Async Task)的上下文中,一个命令可能在还在执行时被多次触发。

1.3. Prism框架中的异步命令

  • Prism 9.0版本引入了AsyncDelegateCommandAsyncDelegateCommand<T>,这两个类是用于处理异步命令的。

1.4. 异步命令接口

  • IAsyncCommand接口继承自ICommand,它定义了两个执行异步命令的方法:ExecuteAsync(object? parameter)ExecuteAsync(object? parameter, CancellationToken cancellationToken)。这两个方法允许命令以异步方式执行,并且可以选择性地接受一个取消令牌(CancellationToken)。
public interface IAsyncCommand : ICommand
{
    Task ExecuteAsync(object? parameter);

    Task ExecuteAsync(object? parameter, CancellationToken cancellationToken);
}

1.5. 平台支持和自定义实现

  • 没有平台明确支持异步命令的概念,任何异步命令的实现都是特定于实现库的。尽管如此,这提供了创建支持IAsyncCommand的自定义控件的能力。

1.6. AsyncDelegateCommand的好处

  • AsyncDelegateCommand的一个好处是它支持可能接受也可能不接受取消令牌(CancellationToken)的委托。

2.并行执行(Parallel Execution)

  1. 默认行为:默认情况下,AsyncDelegateCommand不允许并行执行。这意味着如果一个命令正在执行,那么即使有新的命令触发,它也不会立即执行,而是会等待当前命令执行完毕后才开始执行新命令。

  2. 启用并行执行:如果你希望允许并行执行,即多个命令可以同时执行,你需要调用EnableParallelExecution方法来启用这一功能。启用后,即使当前有命令正在执行,新的命令也可以开始执行,不会等待当前命令完成。

  3. CanExecute的行为:在默认行为下,当命令正在执行时,CanExecute会自动返回false,这意味着用户界面上的控件(如按钮)会被禁用,即使你可能为CanExecute委托提供了其他自定义逻辑。这是为了防止在命令执行期间用户界面上的状态不一致。

  4. 代码示例:示例代码创建了一个AsyncDelegateCommand实例,并调用了EnableParallelExecution方法来启用并行执行。这个命令执行的是一个异步任务,该任务立即完成(Task.CompletedTask),这通常用于测试或示例。

new AsyncDelegateCommand(async () => Task.CompletedTask)
    .EnableParallelExecution()

3.配置CancellationTokenSource

  1. 配置CancellationTokenSource:这是用于控制异步命令取消操作的配置部分。CancellationTokenSource可以被配置为两种方式:

  2. 提供TimeSpan以设置默认超时时间:你可以通过提供一个TimeSpan对象来为你的异步命令设置一个默认的超时时间。这意味着,如果在指定的时间内异步操作没有完成,那么它将自动被取消。这是一种确保长时间运行的异步操作不会无限期等待完成的方法。

  3. 提供Func<CancellationToken>来提供命令使用的CancellationToken:另一种配置方式是提供一个函数(Func<CancellationToken>),这个函数返回一个CancellationToken。这个CancellationToken将被用于异步命令,允许在需要时手动取消异步操作。这种方式提供了更灵活的控制,因为你可以根据特定的逻辑来决定何时取消操作。

相关链接

;