Electronic Joint Business

Solution for E-Business

dotNet

在 .NET 4.5 中使用 Websocket

作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 TCP ”之称的 WebSocket 格外吸引开发人员的注意。WebSocket 的出现使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道。Web 开发人员可以非常方便地使用 WebSocket 构建实时 web 应用,

IETF 的 RFC 6455 对 WebSocket 协议进行了标准化, 在 Wikipedia 和 W3C 站点上提供了更多的介绍和详细资料。

WebSocket 连接是通过在客户端和服务器之间的 HTTP 握手来建立的(前缀是 “ws://” 或者 “wss://”) 。拿 Wikepedia 上例子来说明,客户端会这样发出请求:

GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

之后服务器发出响应来接受连接:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

这里的 “Sec-WebSocket-Key” 和 “Sec-WebSocket-Accept” 用于通过密钥验证算法来确认客户端和服务器之间的连接。

>>> 阅读全文

 

, , , ,

.NET 4.5 的五大最佳特性

.NET 4.5 已经发布了将近一年了,现在有个问题是 .NET 开发者的对于微软最新的发布版,通常只约略知晓一到两个特性,其它则只流于表面,它们最终不过成为 MSDN 上的简单文档说明而已。

如果你问个开发者 .NET 4.5 核心框架中多了哪些新特性,大部分人只会回答 async 和 awaitt。(至少和我打交道的人只提到了上面这些特性。)

确实,要深入了解所有的新特性非常困难。特别是,是否值得去了解这些特性完全取决于你手边的工作。

因此,在这篇文章中,我会介绍我所喜欢的几个 .NET 4.5 核心特性。这只是我个人的偏爱,未必就是你的最爱。不过如果我选的这些话题对不断壮大的 .NET 社区能有所帮助,那我就心满意足了。

注意: 本文只会涉及与 .NET 核心框架相关的新特性,而不讨论诸如 ASP.NET、 WCF、 WPF、 WWF 等等特性。

>>> 阅读全文

 

, ,

通过 C# 使用 ZeroMQ (二) 多段式消息,JSON 和同步发布/订阅模式

文章评价:

这是该系列文章的第二部分。在这部分文章中,我们会讨论 ZeroMQ 所能发送和接收的两大类消息,并且如何用 JSON 来格式化消息。我们还会学习 如何使用轮询 (polling) 机制。在文章的最后,我们举例说明什么是同步发布/订阅模式。

ZeroMQ消息
ZeroMQ 套接字可以发送或者接受单段式消息(single-part)或多段式消息(multi-part)。

单段式消息
所谓单段式消息,就是一个消息只包含一帧。所谓帧是一个字节数组,其长度可以零以上的数值。在 ZeroMQ 参考手册中,帧也被叫做“消息段 message parts”。

举个单段式消息的例子,就比如说上一篇文章中我们发送/接收的所有消息都是单段式消息。在发送和接收的操作中,我们使用的是字符串,而字符串实质也是一个字节数组。

>>> 阅读全文

 

, , , ,

通过 C# 使用 ZeroMQ (一) ZeroMQ 通讯模式

文章评价:
ZeroMQ (也拼写作 ØMQ、 0MQ 或 ZMQ) 是个非常轻量级的开源消息队列软件。它没有独立的服务器,消息直接从一个应用程序被发送到另一个应用程序。ZeroMQ 的学习和应用也非常简单,它只有一个 C++ 编写成的单个库文件 libzmq.dll, 可以链接到任何应用程序中。如果要在 .NET 环境中使用,我们需要用到一个 C# 编写的名为 clrzmq.dll 包装库。

ZeroMQ 可以在 Windows、 OS X 和 Linux 等多种操作系统上运行, C、 C++、 C#、 Java、 Python 等语言都可以编写 ZeroMQ 应用程序…这使得不同平台上的不同应用程序之间可以相互通讯。

ZeroMQ 的核心
ZeroMQ 的主要部分是套接字 Socket,不过它并未直接使用传统的套接字,而是在传统的套接字 API上提供了一个抽象层,这让用户从复杂和重复的编程任务中解脱出来。ZeroMQ 支持多种类型的套接字 (类型被定义为套接字自身的一个属性)。发送端和接收端的套接字类型组合造就了多种不同的通信模式,本文的后面我们会涉及到这一部分。

异步通讯
ZeroMQ 提供了异步通讯方式,这意味着即使在设置或关闭套接字连接、重新连接或进行消息传递的时候,应用程序都不会被阻塞。与程序正常任务处理并行的,这些操作由 ZeroMQ 自身在后台线程中进行管理。在需要时,ZeroMQ 会自动将消息 (无论是发件端或接受端) 放入队列中, 这一过程相当智能,消息会被推送到离接收端尽可能近的队列中。

传输协议
ZeroMQ 支持四类传输协议。每种传输协议由地址字符串来定义,该字符串由两部分组成:transport://endpoint。传输(transport) 部分指定了所使用的底层传输协议,端点(endpoint) 部分的格式则随着使用的协议而有所不同,具体如下:

>>> 阅读全文

 

, , , , ,

.NET 4.5 并行之新特性

原文

随着 .NET 4 和 Visual Studio 2010 的发布,微软为并行提供相当广泛的支持,包括: 任务并行库 (TPL)、 并行 LINQ (PLINQ)、 新的同步和协调原语集合 (如 ConcurrentDictionary),为处理并行工作负荷而改进的线程池、 新的调试器窗口、 新的并发可视化工具,等等。自那时起,微软一直致力于埋头开发新的 .NET 4.5 和 Visual Studio 11。这是对 Visual Studio 11 开发者预览的一瞥。

更好的性能

任务并行库

More and more, TPL is becoming the foundation for all parallelism, concurrency, and asynchrony in the .NET Framework. That means it needs to be fast… really fast. Performance in .NET 4 is already good, but a lot of effort was spent in this release improving the performance of TPL, such that just by upgrading to .NET 4, important workloads will just get faster, with no code changes or even recompilation required. As just one example, consider a long chain of tasks, with one task continuing off another. We want to time how long it takes to set up this chain:

>>> 阅读全文

 

, , ,

Nemerle语法指南 之二

在本章中,我们会介绍一些 Nemerle 中如何定义类等等面向对象的元素,它和 C#、Java 或者 C++ 有些类似,但是略有区别。 同时,我们也会关注循环和一些简单的宏。

类的定义
我们不再介绍什么是类,关于这个问题,你可以参考任何一种面向对象的语言。在 Nemerle,关键字class用来定义一个类,基本格式是

class MyClass {
  // something inside
}

在类中可以定义很多实体,这些实体可以用访问修饰符或者其他修饰符来描述。

修饰符Modifiers
Nemerle 中有许多修饰符,最常见莫过于public, static和mutable。

我们将首先看一下访问修饰符。修饰符指定了其他类访问指定实体的方式。访问修饰符可以修饰类中定义的任何一个实体,默认为private。而public和interal则可用以修饰类,默认是internal,这些修饰符的含义如下:

>>> 阅读全文

 

, ,

Nemerle语法指南 之一

Nemerle 是.NET家族中的新丁,是 Microsoft 的研究项目之一,它由Wrocław大学的Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszt等人发明。目前最新版本是1.0。

和 C#, VB.NET,F#等现有的.NET家族成员不同,Nemerle 是种多范式的编程语言,之所以称之为多范式语言,是因为它支持以下范式:

  • 面向对象编程 Object-Oriented Programming (OOP)
  • 函数式编程 Functional Programming (FP)
  • 元编程 Metaprogramming (MP)
  • 面向组件编程 Component-Oriented Programming (COP)
  • 面向领域专用语言编程DSL-Oriented Programming (DOP) 或面向语言编程Language Oriented Programming (LOP).
  • Nemerle 中最突出的是其元编程能力,它是基于和Lisp语言类似的宏的机制。

    设置Nemerle编译环境
    最新发布的Nemerle 1.0版本提供了和Visual studio 2010集成的能力,你可以在google code上下载到最新的版本。你需要的是基于.NET 4.0的Nemerle语言包Nemerle VS2010扩展这两个Zip文件。

    安装Nemerle很简单,用7-Zip打开VS 2010扩展文件的压缩包,双击包内后缀为vsix文件,就可以自动安装Visual studio 2010的Nemerle语言的支持。然后再将Nemerle语言包直接解压到”%Program files%\nemerle”目录即可,%program files%视你的操作系统略有不同,在32位Windows上,它指的是C:\Program Files,而在64位Windows系统上,则应该是C:\Program files (x86)目录。

    >>> 阅读全文

     

    , ,

    托管C++ (一) C++/CLI的诞生

    Managed C++

    和通常的VC++不同,托管(Managed) 是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,通用语言运行时是.NET 框架应用程序的执行引挚。它提供了许多服务,其中包括:代码管理(装入和执行)、类型安全性验证、元数据(高级类型信息)访问、为管理对象管理内存、管理代码,COM对象和预生成的DLLs(非管理代码和数据)的交互操作性、对开发人员服务的支持等等。 也就是说,托管C++意味着,我们的代码可以被CLR所管理,并能开发出具有最新特性如垃圾自动收集、程序间相互访问等的.NET框架应用程序。

      可见,Managed C++(下称MC++)是有别于原来的C++(下称VC++)的一种新的而且十分特殊的.NET语言。

    MC++ 的特殊之处在于 Micorsoft 为 MC++ 提供了一种称之为“it just works”的Interop机制,后称“Interop技术”。即对程序中的每一个本地方法,MC++ 编译器同时生成一个托管和非托管进入点,它们中只有一个是真正方法的实现,另一个则是转发器,可进行相应的转换和必要的调度。托管进入点通常是真正方法的实现,除非代码不能解释为MSIL或开发者使用“#pragma unmanaged”强制指定进入点的实现为本地机器码。当一个 IJW 转发器起作用时——例如转发到本地代码中,编译器提供转换的实现,并且通过偏移或 IAT(Import Address Table)调用实际的实现代码;因此用 MC++ 编写的程序同时拥有托管代码和非托管代码。

    我们先来看一下这个例子。在这个例子中,我们混合使用了托管代码和非托管代码。在托管代码中,我们不能使用类似嵌入汇编等等许多特性,这就是为什么同时使用托管和非托管代码有时很重要。

    >>> 阅读全文

     

    , ,

    细谈UI线程的SynchronizationContexts

    [b]为什么需要SynchronizationContexts[/b]
    在图中的演示里,我试图用ironruby或者ironpython去控制一只小乌龟,(就是那个三角箭头),通过ironruby的命令让小乌龟前进、后退、左转、右转。

    这里存在一个线程同步的问题,敲下一个命令之后,屏幕上的UI物件应该要马上按指令运作(体会一下魔兽世界的宏),所以小乌龟工作在一个UI线程里,而命令窗口工作在一个非UI的线程,如果不加任何处理的话,直接在命令窗口里操作UI物件的引用就会导致一个System.InvalidOperationException: “Object is currently in use elsewhere”(.net 2.0),或者得到一个不可知的状态(.net 1.0)。

    [b]应用场景和解决方案[/b]

    上面提出的一个很常见问题:应用程序有两个线程:线程A和线程B,不过线程B比较特殊,它属于UI线程,当这两个线程同时运行的时候,线程A有个需求:”修改UI对象的属性”,这时候如果你是线程A,你会如何去完成需求呢?!可能有几种解决方案。

    第一种方式:

    >>> 阅读全文

     

    , , ,

    Axum, 一切为了并行 (三)

    [b]域与状态共享[/b]

    消息传递是种优秀的沟通机制,但它要消息中的数据必须可以被深拷贝或者不可变。但有时代理间共享数据会让程序更有效率,也更简单,当然,要提供一种安全的方式。

    这就是设计出域的目的。域存在的目的是允许一组代理安全的共享状态,同时将该状态与其他人等隔离开来。

    [b]在代理间共享状态[/b]

    象普通类,域可以包含字段与方法,但更重要的,域定义可以包含代理的定义,在域内定义的代理可以存取域的字段。如

    >>> 阅读全文

     

    ,

    C# 4.0中的可选参数

    适用C#版本:4.0+。

    可选参数这个概念最早来自于Visual Basic,而后为Ruby等等动态语言所广泛采用。在C# 2.0年代,并没有可选参数这个概念。 这个限制是因为在 C# 中,任何地方都引入面向对象思想,所以尽量使用重载而不是可选参数。

    class MsgEcho
    {
      public MsgEcho():this("hi,world")
      {
      }
      public MsgEcho(String name)
      {
         Console.WriteLine(name);
      }
    }

    可选参数(Optional parameters)是C# 4.0的一个新特性,可以为一个方法的参数设置一个默认值。为一个参数设置一个默认值,这个参数就是可选参数,一旦被调用的方法忽略可选参数,就会用默认值代替。

    为什么需要开放命名参数和可选参数呢?这是出于动态语言运行时兼容性的要求。动态语言中存在动态绑定的参数列表,有时候并不是所有的参数值都需要指定(有些语言可能没有重载决策);另外,在一些 COM 互操作时,往往 COM Invoke 的方法参数列表非常的长(例如 ExcelApplication.Save,可能需要 12 个参数),但 COM 暴露的参数的实际值往往为 null,只有很少一部分参数需要指定植,如 ExcelApplication.Save(),可能不需要指定任何参数值,或者仅仅一个值,例如 fileType

    合 Visual Basic、Visual C++ 或者 Delphi 一样,C# 声明可选参数的方法就是在方法参数声明后面加上参数的默认值:

    >>> 阅读全文

     

    ,

    在.NET中使用嵌入式Firebird (附驱动更新)

    Firebird 脱胎于 Borland 公司的开源版数据库 Interbas e6.0,是一个完全非商业化的产品, 用 C 和 C++ 开发。由于与 interbase 的血缘关系,大部分 interbase 的开发工具可以直接应用 到 Firebird 开发中。

    Firebird 2.0 项目已于 2005年2月份开发完成,2005年5月发布。下面列举一些 Firdbird 2.0 新增加的功能:

    • 对 SQL 标准支持增强:支持 SQL200X 标准定义的“派生表”(derived tables)、为了和 SQL-99 标准一致,引进了“SEQUENCE”,用来代替“GENERATOR”;
    • 经典结构模式(Classic architecture)支持全部API;
    • 支持 64 位操作系统平台;
    • 内置函数增加;
    • 存储过程语言(PSQL)增强:支持“显式游标”、存储过程支持默认参数、支持“LEAVE标号”语法、将用户自定义函数(UDF)作为存储过程调用等;
    • 索引得到增强:252字节限制取消、支持“表达式索引”等;
    • 改进的优化器;
    • 安全增强:安全数据库结构改变、口令加密更安全、远程不能访问安全数据库、阻止“暴力破解”行为;
    • 在线增量备份。

    单从功能上,Firebird 比 SQLite 要强大许多,并且 FireBird 有多种版本,包括服务器版,单机版以及嵌入式,不管是服务器版还是嵌入式版它都完整支持视图、触发器、存储过程等SQL高级特性。

    部署嵌入式FireBird十分简单,只需要把 fb Embedded Server 的 “fbembed.dll” 拷贝到应用程序目录下。在 .net 的工程项目中则可以包含 fbembed.dll 文件,并将其属性设置为 “copy always” 或者 “copy if newer” 即可。

    在 C# 中使用嵌入式 Firebird 需要 .net provider 1.6以上版本,典型的 ConnectionString 如下:

    >>> 阅读全文

     

    , , , , , ,

    Axum, 一切为了并行 (二)

    [b]代理编程[/b]

    上面的斐波那契数列的例子只是展示了一个微不足道的构建数据流网的例子。这类网络适合那些“数据流入,数据流出”的场景,但它不能指定数据如何在网络中传播,也不允许不同类型的数据流入或者流出网络。

    代理与通道给了我们创建复杂数据流网所需的一切。

    通过通道沟通的两个代理是种弱关系:它不需要知道或关系另一个代理是如何实现的。它们之间的“契约”只由通道指定。借用OOP中的概念,通道扮演了接口的角色,而代理则是实现了该接口的类。

    使用通道时,你向输入端口发送数据,从输出端口接受数据,这里,输入端口扮演了目标,而输出端口扮演了源头。而实现通道时,输入端口则是源头,输出端口则是目标。这有点难以理解,想想家里的水处理机,如果水是数据的话,考虑水的流向,你把水倒入入水口(水相对于你是流出),从出水口接水(水相对于你是流入),而处理机内部而言,水则是从进水口流入,从出水口流出。

    >>> 阅读全文

     

    , , , ,

    Axum, 一切为了并行 (一)

    编写并行程序并不容易,首先要将方案切割为许多并行任务(Task)。较为简单的方案,如计算每只股票的年收益率,很容易实施并行,因为任务之间彼此独立。但另外一些方案则十分复杂,任务之间彼此依赖且要相互协作,比如网络游戏。

    Axum试图提供一种更为自然的方式来安排组件之间的协作问题。换句话说,如果将方案按照交互式组件建模,在Axum中编码会更为直接了当,而且你可能可以不被许多常见的并发问题所困扰。

    并行的另一个目的是为了提速。经常,程序的反应速度总被象I/O或者用户输入这样的慢速组件所拖累。比如email客户端通过慢速的网络下载邮件的时候,程序还应该能继续响应用户的动作。

    Axum的目标之一就是程序不需要再担心并发问题,理论上,你的程序将变得快速而且响应及时。为此,Axum不允许自由的共享和变更线程的状态,而只允许“有节制地”存取共享的状态,这解决了许多并发问题。

    从”Hello,World”开始

    >>> 阅读全文

     

    , , ,

    初窥Nemerle语言

    Nemerle是Microsoft的研究项目之一,由 Wrocław 大学的Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszt等人发明,从2003年0.2版本开始,Nemerle不断地在改进中。

    作为一种新的语言,Nemerle有什么特点呢? Nemerle是一种多范型的语言(面向对象和函数式),完全支持编译器宏(更类似是Lisp的变种,而不是C++),以及许多其他的东西。Nemerla与VS2010里发布的F#不同,后者是纯函数式语言。因此,Nemerle提供了与C#近似的语法和强大的元编程系统。

    有关meta-program可以参考:wiki百科

    你可以在官方站点下载它的最新发布,在发布包中还带有与visual studio的集成的IDE,可以很方便地学习Nemerle语言,最新版本是1.0 RC1。

    这篇文章将带你快速浏览一下Nemerle的一些语言特性。

    >>> 阅读全文

     

    , , ,

    Previous Posts