当前位置: 首页 > article >正文

【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将被用于异步命令,允许在需要时手动取消异步操作。这种方式提供了更灵活的控制,因为你可以根据特定的逻辑来决定何时取消操作。

相关链接

  • 介绍(Introduction)
  • 命令(Commands)
    • 命令(Commanding)
    • 复合命令(Composite Commands)
    • 异步命令(Async Commands)

http://www.kler.cn/a/399624.html

相关文章:

  • 2.STM32之通信接口《精讲》之USART通信
  • 【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出
  • GRE做题笔记(零散的个人经验)
  • vue+svg圆形进度条组件
  • FPGA使用Verilog实现CAN通信
  • Spring中的Bean
  • 深入浅出 Go 语言:现代编程的高效选择
  • 【PGCCC】Postgresql 存储设计
  • Flink运行时架构以及核心概念
  • 基于SpringBoot+Vue的船舶维保管理系统(带1w+文档)
  • UE5的线程同步机制
  • 鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作
  • Rewar Model的输出(不包含训练)
  • <有毒?!> 诺顿检测:这篇 CSDN 文章有病毒
  • Gin 框架中的路由
  • PostgreSQL高可用Patroni安装(超详细)
  • datalist 是什么?以及作用是什么?
  • Android 判断当前是否亮灭屏状态或黑屏锁屏状态
  • 小白快速上手 labelme:新手图像标注详解教程
  • 集群聊天服务器(3)muduo网络库
  • 编译sddm 0.18.1 依赖
  • 图像分类之花卉识别实验验证
  • LeetCode59. 螺旋矩阵 II
  • 交换排序——快速排序
  • 网络基础Linux
  • Spring MVC 与 JSP 数据传输