Prism Commands
1.异步命令(Async Commands)
1.1. 命令作为事件处理器:
- 命令(Commands)实际上是一种事件处理器(EventHandler)。这意味着,如果一个命令被设计为异步执行,那么在命令还在执行的过程中,可能会被多次调用。
1.2. 异步任务中的命令调用:
- 特别地,在异步任务(Async Task)的上下文中,一个命令可能在还在执行时被多次触发。
1.3. Prism框架中的异步命令:
- Prism 9.0版本引入了
AsyncDelegateCommand
和AsyncDelegateCommand<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)
-
默认行为:默认情况下,
AsyncDelegateCommand
不允许并行执行。这意味着如果一个命令正在执行,那么即使有新的命令触发,它也不会立即执行,而是会等待当前命令执行完毕后才开始执行新命令。 -
启用并行执行:如果你希望允许并行执行,即多个命令可以同时执行,你需要调用
EnableParallelExecution
方法来启用这一功能。启用后,即使当前有命令正在执行,新的命令也可以开始执行,不会等待当前命令完成。 -
CanExecute的行为:在默认行为下,当命令正在执行时,
CanExecute
会自动返回false
,这意味着用户界面上的控件(如按钮)会被禁用,即使你可能为CanExecute
委托提供了其他自定义逻辑。这是为了防止在命令执行期间用户界面上的状态不一致。 -
代码示例:示例代码创建了一个
AsyncDelegateCommand
实例,并调用了EnableParallelExecution
方法来启用并行执行。这个命令执行的是一个异步任务,该任务立即完成(Task.CompletedTask
),这通常用于测试或示例。
new AsyncDelegateCommand(async () => Task.CompletedTask)
.EnableParallelExecution()
3.配置CancellationTokenSource
-
配置
CancellationTokenSource
:这是用于控制异步命令取消操作的配置部分。CancellationTokenSource
可以被配置为两种方式: -
提供
TimeSpan
以设置默认超时时间:你可以通过提供一个TimeSpan
对象来为你的异步命令设置一个默认的超时时间。这意味着,如果在指定的时间内异步操作没有完成,那么它将自动被取消。这是一种确保长时间运行的异步操作不会无限期等待完成的方法。 -
提供
Func<CancellationToken>
来提供命令使用的CancellationToken
:另一种配置方式是提供一个函数(Func<CancellationToken>
),这个函数返回一个CancellationToken
。这个CancellationToken
将被用于异步命令,允许在需要时手动取消异步操作。这种方式提供了更灵活的控制,因为你可以根据特定的逻辑来决定何时取消操作。