摘要: 该系列文章是由Matthew Podwysocki撰写,并发表在code better上的。IntroductionCreating ObservablesCreating ObserversjQuery IntegrationComposing CallbacksFrom Blocking to AsyncWikipedia LookupComposing DeeperBing Maps and...
阅读全文
摘要: CCR介绍 API概览 Ports和PortSet 协调原语(Coordination Primitives) 任务调度 迭代器 失败处理 与非CCR代码互操作 其他的并发方法
阅读全文
VS2010全面采用了WPF技术构建,编辑器可以充分利用计算机的硬件图形加速功能,所以如果在编辑器中使用Clear Type字体,显示效果会非常漂亮。但是这个功能只局限于本地计算机,一旦使用远程桌面进行开发,原本漂亮平滑的字体就会变得毛糙。这是因为远程桌面为了性能原因禁止了Clear Type。今天偶尔调节了一下编辑器的缩放功能(左下角那个写着100%的下拉框),发现当放大比例高于一定程度(比如11号字体放大到150%的时候在我的屏幕上很漂亮)时即使没有Clear Type,字体就会又变平滑。但是每次打开一个文件就要调一遍缩放比例让我非常的不爽,我们是程序员,当然要自动化一切可以自动化的东西。Google了一番找到了解决办法,步骤如下:
- 安装VS2010 SDK
- 从GitHub下载DisableMouseWheelZoom项目的代码
- 打开这个工程,然后在代码(只有一个cs/一个class/一个方法,所以别说你找不到哈)中增加一行:textView.ZoomLevel = 150D; //代表放大到150%,如果你不需要禁用鼠标滚轮缩放的话,删掉另外一行。
- 编译,然后安装生成的VSIX
- 重启VS2010,再打开一个文件看看吧,是不是已经自动放大到150%了
另外如果机器的配置不够,启动硬件加速会导致VS2010比更卡,这时也可以用这个办法来调整。
Have fun!
后记:
本来以为一行代码就能搞定的,发现虽然放大了字体,但是旁边的outline却没有一起被放大,我猜测是初始化顺序的问题,在设置ZoomLevel时Outline控件还没有挂接TextView的事件,所以没有响应。用如下代码就能解决:
var op = AsyncOperationManager.CreateOperation(null);
op.PostOperationCompleted(o => {
textView.ZoomLevel = 150D;
}, null);
其实道理也很简单,通过异步Post把修改ZoomLevel的方法放入消息队列等待,让TextView先执行TextViewCreated事件之后的方法,这样就可以正确的初始化outline,再设置ZoomLevel就可以让TextView与Outline一同缩放了。
CCR,并发与协调运行时(Concurrency and Coordination Runtime)。从名字里我们就可以知道,这个东东是用来简化并发程序设计的。为何要并发呢?因为我们有多个任务需要处理,如果能同时做就会充分利用硬件而减少处理的时间。自然的,CCR也是以“任务”为核心进行设计的,CCR中的代码也可以分为如下几个功能:描述任务、生成任务、调度任务和执行任务。
描述任务
对于计算机来说一个任务就是一段需要执行的代码,于是CCR有一个对任务的最抽象描述:ITask接口
任务被封装在ITask实例中,当CCR调度这个任务实例去执行之后,CCR会调用ITask.Execute方法来执行该任务。在ITask接口之下,派生出来各种各样的Task
本节讨论的是CCR的整体结构,后面我们会具体讨论这些classes。
生成任务
对于计算机来说,任务都是类似的:按给定的参数执行一个给定的方法。但是对于程序员来说,往往并非这么简单。从时序上来讲,任务可以分为这么几种情况:算法和参数都已经齐备的、已知算法等待参数的和已知参数等待算法的。对于第一种情况,直接使用Thread或者ThreadPool也可以很方便的解决问题,当然CCR也提供了相应的支持。对于后面两种情况,CCR使用了计算过程与参数分离描述的方法来解决。计算机的程序的作用就是处理流程相对固定的事务,往往计算逻辑是有限的而参数是变化无穷的。于是CCR将计算过程与参数分离开来,调用者不需要知道如何处理这些参数,甚至不需要知道是谁何时来进行处理,它只需要把要计算的数据发送到一个特定的地方即可,而这些数据会被可信赖的得以处理。当计算过程接收到适当的参数的时候,也就生成了任务。CCR中Port和PortSet类型就是这样的参数存储器。ReceiverTask及其子类则是封装计算过程的类型,Port可以被注册到相应的ReceiverTask中,当有其他用户向Port中投递元素时,就会生成任务并放入相应的DispatcherQueue中等待调度。
调度任务
需要执行的任务是有先来后到、轻重缓急的,同时计算机的CPU资源是有限度,每个核(包括超线程的逻辑核)在同一时间只能处理一个线程。这时候就需要进行一定的调度。为了充分利用CPU,自然是要使用多线程来执行任务。如果不使用CCR,我们也可以用.net内置的Thread和ThreadPool都可以用的并行任务调度,其中又数ThreadPool用起来比较简单,直接把要执行的方法丢进去就好了。但是这简单的背后也存在问题,虽然是解决了任务的先来后到,但是没办法分轻重缓急了,ThreadPool坚持认定CPU面前人人平等的原则,晚来的就是要侯着等先到底执行完。直接用Thread也有问题,就是无法很容易的控制线程的数量以及重用线程,而线程本身又是一个比较重型的资源,反反复复的创建和销毁很影响效率。为了解决这些问题CCR提出了自己的任务调度方案。DispatcherQueue。
DispatcherQueue本质上就是一个任务队列,它使得任务按照先来后到的顺序执行。但是你可以创建多个DispatcherQueue,比如把高优先级的任务放入一个队列,把普通优先级的放入另外一个,那么高优先级的任务不需要等待前面所有普通优先级任务都执行完毕才得到执行。
执行任务
Dispatcher是CCR的执行单元,也是一个线程池的实现。既然是线程池,那么就必然有它所要管理的工作线程,TaskExecutionWorker类封装了Dispatcher中工作线程所要执行的方法以及一些必要的处理。

由于CCR的源码并没有直接公开,所以我们需要借助一些工具来窥探它的秘密。
分析CCR需要如下的工具
MS Robotic Studio Express 2008R2,这个就不用解释了,安装它就是为了获得CCR
Reflector & FileDisassembler,Reflector有两个作用,一个是用来把CCR的dll文件反编译到C#语言,第二个是直接对CCR进行一些分析,而这些分析在VS中并不容易。FileDisassembler是Reflector的一个插件,用来把反编译的结果导出为一个C#工程。
Visual C# 2008 Express or Visual Studio 2010 beta2(推荐,因为VS 2010大大增强了多线程调试能力)
以上工具皆可合法的免费获得
CCR源码和例子程序
Microsoft.Ccr.Core.dll是我们本次要研究的对象。为了分析和调试的方便,我们需要把它用Reflector和FileDisassembler反编译。注意,反编译后的源码可能有些问题,下面记载了几个比较重要的修改:
1. Resource文件。我们需要先删除Reflector生成的Resource1.cs,然后新建一个名为Resource1.resx的资源文件,把Reflector生成的Microsoft.Ccr.Core.resx中的字符串全部复制到Resource1.resx中,最后删除原来的Microsoft.Ccr.Core.resx
2. Dispatcher.cs中有两个静态变量的初始化顺序不正确,需要吧TraceSwitchCore的声明和初始化语句放在文件最顶端。
Sample Code,为了统一起见,我选择了MSDN Mag中的这篇文章中的代码。
解压Sample Code后,用VS创建一个CCRDemo的project,把解压得到的代码添加到CCRDemo项目中,再把反编译得到的CCR源码工程也加入这个Solution中,最后给CCRDemo添加CCR的引用。如果能编译并运行CCRDemo,则说明我们的分析环境已经构建好了。
摘要: 原文链接去中心化软件服务(DSS)是一个基于CCR的轻量级.net运行时环境。DSS提供了一个轻量级的,状态导向的服务模型,它将REST概念和构造高性能高扩展性应用的系统级方法结合在一起。在DSS中服务被暴露为一种可以被程序和UI操作界面访问的资源。通过集成:状态隔离、结构化状态操作、事件通知和常规服务组合,DSS解决了编写运行在一个节点或者跨网络的高性能、可观察、松耦合的应用程序的需求。DSS的...
阅读全文
摘要: 今天翻阅msdn时看到一个概念Domain Neutral Assemblies,虽然这个咚咚的名字字面意思挺清楚,但是之前从未接触过,于是特意搜索了一番,东拉西扯之下,也学到了一些关于App Domain的有趣的东西,在这里总结记录一下。首先,App Domain是什么?MSDN里给出了一堆文字来说明。其实简单的说,App Domain就是是一个轻量级的进程。 Domain Neutral As...
阅读全文
摘要: Directory Purpose /etc System configuration files are stored here. /bin This directory holds binaries that must be accessible at all times and that ordinary users are likely to run. /sbin This dir...
阅读全文
摘要: http://www.codeproject.com/KB/cs/FastMethodInvoker.aspxhttp://www.cnblogs.com/JeffreyZhao/archive/2008/11/22/invoke-method-by-lambda-expression.htmlhttp://www.codeproject.com/KB/cs/FastMethodInvoker.a...
阅读全文
摘要: 安装说明确实写的很清楚很详细,没有什么其他的,唯一需要注意一点就是安装顺序。如果在安装TFS 2008之前安装了任何其他VS 2008的相关产品,请卸载。然后再安装TFS 2008、TFS 2008 SP1之后再安装VS2008。否则会报一个Error 200082的莫名其妙的错误。
阅读全文