写点什么

何时在 WPF 中使用 Async 及 Reactive Extensions

2013 年 3 月 28 日

Ian Griffiths 发布了包含六部分的一系列文章,讨论了何时应该、及何时不应在 WPF 中使用.NET 4.5 中的 async 特性。这个系列始于一篇名为“ Too Much, Too Fast with WPF and Async ”的贴子。

有了 async 这件神器,似乎有人就想在应用程序中到处使用,并时时刻刻调用它。不幸的是,如果每个 batch 的大小(即 async 调用之间的时间差)小于创建 Task 对象及对应的上下文切换的消耗,这种情况下 async 就不那么好用了。

Ian 写道,大的 batch 可以减少任务完成的总体时间,但又可能影响到 UI 的响应。

虽然这远远快于 8.5 秒的情况,但我们也作出了牺牲:那个总体速度较慢的例子反而为 UI 更快地提供了有用的信息。实际上,用户可能会更倾向于较慢的那个版本,因为有用的信息能够立即出现,你可能不会感觉到装载整个列表的速度慢了三倍——将整个列表拖动到底部的时间说不定都远远长于 8.5 秒了。按照这个重要的指标来看,单纯地使用异步方法是更好的选择:它为用户更快地提供了有用的信息。

Ian Griffiths 也谈到了使用线程池与 WPF 4.5 中的集合同步(Collection Synchronization)新特性。如果你要使用 ConfigureAwait(false) 方法来避免强制在 UI 线程上进行处理,这项技巧也是必不可少的。

调用 ConfigureAwait 表示我们并不关心方法在哪个线程上继续执行。要点在于,某个不能立即完成的读操作最终会完成,而方法的余下部分会在一个线程池的线程上延迟执行。这意味着使用 await 不会再导致 WPF 的调度占用。但当然,它也意味着列表的全部更新都会发生在一个工作线程上,因此我们需要使用同样的小花招以避免产生问题:要么等到方法完成后再绑定数据并显示列表,要么就必须处理跨线程的变更通知。

Ian 所演示的另一个技巧是使用Reactive Extensions 分块处理数据。它使用了Buffer 函数将batch 大小限制为100ms,或是将总数限制为5000 个(取决于先达到哪个数值),然后通过ObserveOnDispatcher 函数将其封装回送至UI 线程。这种模式比起其它技巧显得冗余,但它“几乎能够立即开始显示[…] 数据,并在2.3 秒内完成加载并显示所有数据”,这比原来的同步实现还是有所改进。

查看英文原文 When to Use WPF with Async and Reactive Extensions


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013 年 3 月 28 日 09:141167
用户头像

发布了 428 篇内容, 共 152.0 次阅读, 收获喜欢 23 次。

关注

评论

发布
暂无评论
发现更多内容

redis持久化RDB与AOF

wjchenge

redis

初识 LeetCode

Puran

LeetCode arts

路漫漫其修远兮

无心水

LeetCode | 1. Two Sum 两数之和

Puran

Python C# 算法 LeetCode arts

坚持ARTS-week2

王钰淇

ARTS 打卡计划

运维日志里隐藏的安全危机,你知道怎么挖吗?听听专家怎么说

secisland

态势感知 关联分析 SOC

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十四)编写测试-显示名

编程道与术

Java 编程 TDD 单元测试 JUnit

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十五)编写测试-断言\假设\使测试失效

编程道与术

Java 编程 TDD 单元测试 JUnit

Docker 搭建 Postgres + pgAdmin 环境

姜雨生

Docker DevOps postgres

霸榜18年,作者连续20年获得微软MVP,这本SQL书凭什么成为畅销经典

图灵社区

数据库 SQL语法 sql查询

奈学大数据开发工程师分享787个技术,快来收割

奈学教育

大数据

Hive底层执行引擎的深度剖析(免费)

奈学教育

大数据 hive

同一浏览器只允许登录一个账号

brave heart

Vue 前端

ARTS打卡week#1

对方正在输入…

ARTS 打卡计划

分布式事务 - 理论模型

Java收录阁

分布式事务

有的线程它死了,于是它变成一道面试题。

why技术

源码分析 jdk源码 线程池 Java 面试

我们是活着,而不是活过

小天同学

个人感想 生活,随想 随笔杂谈 日常思考

谈谈控制感(13):为什么是旁观者清?

史方远

读书笔记 个人成长 心理学 随笔杂谈

手机是21世纪最成功的毒品

Neco.W

学习 提升效率 工作

美国黑客曝出政府惊天内幕,看区块链如何解决!

CECBC区块链专委会

CECBC 区块链技术 民生 不可篡改 信息公开

SpringBatch系列入门之Tasklet

稻草鸟人

spring SpringBatch 批处理

一文入门JVM虚拟机

Simon郎

深入理解JVM

程序员的晚餐 | 6 月 2 日 红烧鸡爪的味道

清远

美食

【vue-openlayers】弹窗

学习委员

html Vue 前端 openlayers ol

带你学够浪:Go语言基础系列 - 8分钟学控制流语句

程序员柠檬

golang 后台开发

工作的创新能力

punkboy

产品 重新理解创业 产品经理 创新突破 创新

安全做到首位 统信UOS后激勃发

统小信uos

网络安全 操作系统

Vim使用总结

JDoe

vim

洞悉MySQL底层架构:游走在缓冲与磁盘之间

arthinking

MySQL 数据库 MVCC

架构演变之路:为何要搞微服务架构?

arthinking

Kubernetes 微服务 dubbo SpringCloud

【译】业务转型是什么?

涛哥

业务中台 数字化转型

「中国技术开放日·长沙站」现场直播

「中国技术开放日·长沙站」现场直播

何时在WPF中使用Async及Reactive Extensions-InfoQ