上周请假回家一趟,休假期间,VS2005 CTP版本发布、ShadowFax新版本发布(终于有了完整的MSI安装包)、ASP.NET Forums 2.0 Beta RC1发布(同样是一个完整的安装程序包)。
走之前,匆忙将以前的一个通过WebService上传文件到服务器的WinForms程序添加了多线程上传的能力。
.Net Framework对多线程有非常良好的支持。而对于WebService,内置的异步调用方式让我们能相对轻松的加入同时调用多个WebService实例方法的能力。WebService对于异步调用有两种处理方式,一是在调用Begin方法时给它一个CallBack函数,在WebService返回时会自动调用这个CallBack方法,二是利用WaitHandle类让客户端当前线程等待WebService返回。
我是采用的相对简单的第二种方式,同时创建多个WebService代理对象,然后调用它们的Begin方法,利用WaitHandle的static方法WaitAll(),让客户端当前线程等待到这些WebService方法全部返回为止。
今天回公司就发现了上周匆忙写就的程序有Bug,因为客户端程序在上传前会动态压缩传输的数据,而服务器上动态解压和接受多个WebService调用的协调处理未能和客户端保持一致,导致了出错。这充分证明了一个准则:
对于多线程同时调用的程序来说,复杂的不是客户端代码,而是接受调用的服务器端代码。