写点什么

何时在 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:141149
用户头像

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

关注

评论

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

深入了解Linux共享内存及函数详解(含编程示例)

ShenDu_Linux

Linux 程序员 内存 进程

我膨胀了,测试必要商城小程序,用了3种方式!:)

清菡

App

架构师训练营第十一周

我是谁

极客大学架构师训练营

Windows下常用软件配置

jiangling500

windows 软件配置

系统安全与高可用

天天向上

保障系统稳定高可用的方案

天天向上

极客大学架构师训练营

吴桐:2021年中国区块链产业发展的六大趋势

CECBC区块链专委会

区块链 新基建

区块链如何解决互联网为基础的广告困境?

CECBC区块链专委会

区块链 互联网广告

我第一次,厚着脸皮晒生活:)

清菡

生活

依赖倒置原则以及接口隔离方式实现接口设计

我们新四军不拿群众一针一线

Defi挖矿软件系统开发|Defi挖矿APP开发

开發I852946OIIO

系统开发

第二周 框架设计 作业一 「架构师训练营 3 期」

feiyun123

极客大学架构师训练营 框架设计

喝完可乐桶后程序员回归本源,开源Spring基础内容

小Q

Java spring 学习 源码 面试

Defi系统APP开发|Defi软件开发

开發I852946OIIO

系统开发

Spring 源码学习 06:AnnotatedBeanDefinitionReader

程序员小航

Java spring 源码 源码阅读

搞懂这篇文章,关于IO复用的问题就信手拈来了

程序员小灰

Linux 后台开发 io epoll Linux服务器开发

vue高级进阶系列——用typescript玩转vue和vuex

徐小夕

Java vue.js Vue 前端

架构师训练营第 11 周学习总结

netspecial

极客大学架构师训练营

架构师训练营第二周作业

J

极客大学架构师训练营

那些年,支撑尾款人们熬夜的AI

脑极体

Week 11 work

黄立

Spring视图解析流程

无用且垂死的星辰

DeFi交易所系统APP开发|DeFi交易所软件开发

开發I852946OIIO

系统开发

智慧公安大数据分析平台开发,警务通APP系统开发

WX13823153201

架构师训练营第二周课后作业

万有引力

架构师系列之8:python网站压测工具

桃花原记

几个大厂的研发类面试题你知道多少?(C/C++工程师方向)

linux大本营

c++ Linux 后台开发 架构师

第二周 框架设计 学习总结

feiyun123

极客大学架构师训练营 框架设计

框架设计作业

cc

Redis系统学习之redis内存模型

北游学Java

数据库 redis C/C++

离开

成周

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

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