有钱难买我乐意

没什么了不起,我的事情我决定

我和仔仔 @ 2007-02-02 15:03

     一开始出现这种Message,我们很不能理解的,为什么会Cancel,谁干的?Timeout另外有Timeout的Message啊!后来问了一下那谁家的小谁,原来他们也遇到过相同的问题,太好了,救星阿!
      事情的经过是这个样子的:
      First,  the property "Keep-Alive" of HttpConnection(1.1 version) is the evil root of this disaster.
      通过System.Net.Tracing配置,我们可以看到这样的Log:
      The underlying connection was closed: A connection that was expected to be kept alive was closed by the server.
      经过调查发现,Keep-Alive is enabled,不过timeout 在server端的设置只有5s,而client端用的默认的值(100s),两端的设置不同。那么这个时候就会出现:用户在5s内不发出任何请求,server端就会把连接关掉,但是对于100s的client端来说,连接还保持着,所以不会重新create一个连接,而是使用原来的连接。这时候,server端就会传回来The request was canceled.

solutions.
1. Set Keep-Alive off.
Override method GetWebRequest of System.Web.Services.Protocols.SoapHttpClientProtocol in our Reference.cs.
        protected override System.Net.WebRequest GetWebRequest(Uri uri)
        {
            System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
            webRequest.KeepAlive = false;
            return webRequest;
        }
但是这种方案的性能不好,因为每次请求结束之后都要关掉连接。再请求的时候还要重新create 一个ServicePoint。
2. Adjust Keep-Alive Timeout Setting on Server-side and MaxServicePointIdleTime on Client-side.
Here is the guildeline of this solution: make sure the idle timeout on the client side is less than that on the server side
E.g.  Keep-Alive Timeout setting on our server is 5s, and then we could modify the MaxServicePointIdleTime in main method of ShellApplication.cs.
Here is the example code:
namespace COM.OOCL.TMS.Shell
{
    public class ShellApplication : FormShellApplication<ShellWorkItem, ShellForm>
    {
                ……
               [STAThread]
        static void Main()
        {
            //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomainUnhandledException);
            //Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
            //The cilent idle time is 4s, which is less than that on server side(5s).
            System.Net.ServicePointManager.MaxServicePointIdleTime = 4000;




 
我和仔仔 @ 2006-07-14 15:10

Delegate

 


delegateC#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。

 


实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate

 


1.  声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。

 


2.  创建delegate对象,并将你想要传递的函数作为参数传入。

 


3.  在要实现异步调用的地方,通过上一步创建的对象来调用方法。

 


下面是一个简单的例子:

 


using System;

 


public class MyDelegateTest

 


{

 


        // 步骤1,声明delegate对象

 


        public delegate void MyDelegate(string name);

 


        // 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型

 


        public static void MyDelegateFunc(string name)

 


        {

               Console.WriteLine("Hello, {0}", name);

 

        }

 


 

        public static void Main ()

 


        {

               // 步骤2,创建delegate对象

 

               MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc);

 


               // 步骤3,调用delegate

 

               md("sam1111");

 

        }

 

}

 


输出结果是:Hello, sam1111


      C#中的事件处理实际上是一种具有特殊签名的delegate象下面这个样子: 

public delegate void MyEventHandler(object sender, MyEventArgs e); 

其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。 

就是这么简单,结合delegate的实现,我们可以将自定义事件的实现归结为以下几步: 

              1.定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。 
2.定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。 
3.定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4.用event关键字定义事件对象,它同时也是一个delegate对象。 
5. +=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。 
6.在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName 
7.在适当的地方调用事件触发方法触发事件。

 

 



 
我和仔仔 @ 2006-07-13 16:40

CAB之Service
      如何使用Service?本文以一个例子来说明具体的设计过程。
      我们把方法的声明和实现分开来,所以用到了接口。
      1.  在接口文件中定义接口IGPSService,其中声明了两个方法GetLatitude和GetLongitude
       public interface IGPSService
     {
          int GetLatitude();
          int GetLongitude();
      }
      2. 接下来在类GPSService中实现这些方法
      [Service(typeof(IGPSService))]
     public class GPSService : IGPSService
     {
          public GPSService()
          {
                MessageBox.Show("Service constructor");
          }

          public int GetLatitude()
          {
                return 42;
           }

           public int GetLongitude()
           {
                return 125;
           }
      }
     可以看到这个类的实现唯一与平常不同的就是开头处的 [Service(typeof(IGPSService))],这是利用Service属性来
使得一个类自动注册成为WorkItem的Service成员。这样CAB就可以非常容易地找到这个服务的实现。用了type,就可
以在不影响其他引用该服务的代码的前提下,改变这个服务的实现。
      注:有一种服务叫On-demand Service。当定义了很多服务时,如果在初始化的时候都load到内存中效率是很低的。在
调用这个服务的时候才load到内存是比较好的方法。只要在服务的实现类中声明AddOnDemand属性为true就可以了。eg:

        [Service(typeof(***), AddOnDemand = true)]
      
        3.至此,Service部分已经实现好了。当在某个View中需要调用一个服务的时候,需要在View的类中加上下面的代码,使View与
        服务联系起来。
        private IGPSService gpsService;
      [
ServiceDependency] //tell CAB that this class has a dependency on IGPSService
//you have not initialized a new service, you want to use a service that
//has already created and stored.
      public IGPSService GPS
      {
           set { gpsService = value; }
      }
      上面的代码告诉CAB,这个类依赖于IGPSService,你想用一个已经被创建的服务,而不是一个新服务。 CAB就用[ServiceDependency] 来实现这个目的。只要在属性前加上这个,就会在一个View添加到WorkItem时自动初始化这个服务。
要在View中使用这个服务,就要添加这个依赖。
     
      4. 在View中调用服务。比如现在要使用服务中的GeLatitude方法。那么只需要
        gpsService.GetLatitude()就可以了。

      这样就基本完成了服务的设计和与view的连接。还有一些与WorkItem的联系,在具体应用中在做考虑。


 
我和仔仔 @ 2006-06-23 13:44

     一直以来担心小妹的高考成绩,因为她自己说考得不太好,今天终于成绩下来了,唉,果真没有逃过。为她难过,拼搏了3年可还是落得个“惨”的结果。可是孩子毕竟努力了,没有人有资格再埋怨她,所以希望所有的人都可以宽容些。
      现在的孩子真是不容易,越来越多的人参加高考,去实现自己或是家长的梦。“谋事在人,成事在天”,可有时天公偏偏不作美,偏偏不让人如愿。不能替她分担,只能尽力安慰她了,毕竟我也经历过。而且现在的形式一年不如一年,孩子们还那么小就要经历这样沉重的压力,好累啊。不仅学习累,心也好累。
      分数虽说不高,但总能有个学上的,希望她可以走好以后的路。


 
我和仔仔 @ 2006-06-20 23:31

       想想本科毕业前夕好像也是这样无声无息的,直至最后一天一一送别好友的时候才真切感受到了毕业的痛苦,更多的应该是离开分别的痛苦吧。现如今,三年的生活眼看就这样结束了,依旧没感觉,只是有点凄凉,或许是寝室人口太少的缘故吧。
       这周就要搬到租的住处去了-一个陌生的环境。刚上大学时,刚来复旦时,都经历了这样由陌生到熟悉的过程。每一次都是泪水、电话、日记陪我度过的,这一次呢?
     
     


 
歪酷博客
日 历
网志文件夹
· 所有网志
最 新 的 评 论
友 情 链 接
友 情 链 接
· 歪酷博客
· 管理我的Blog
· cycy
· TryIt

订阅 RSS

0030471

歪酷博客

本模版系 歪酷博客Zazamu Studio 授权使用 请尊重知识产权