先去看那个ISomeCallbackContract的定义,那个定义非常重要,用来规定在客户端执行的方法用的。
所谓的双工,就是这么处理的,服务端在某个时间(可以用定时器)执行客户端方法(回调函数),而客户端方法的定义在服务端是不知道的,服务端只能知道方法名,也就是那个ISomeCallbackContract接口定义里面的所有方法名,例如它有个SomeCallbackMethod方法,就去执行了。虽然代码在服务端调用,但最终都是在客户端执行的。事实上这个例子并不好,没有参数,因此仅仅执行了一个无意义的方法,一般回调函数都要带上参数传递给客户端,通知客户端具体消息内容,然后让客户端做处理。
如果你还是不能理解,先去看什么是委托,什么是事件。然后看异步操作里面的委托回调。不推荐使用WCF的双工模式编程,弊大于利,除非只是去学习,不可用于实际工业项目,否则麻烦的事会不断。

解决方案 »

  1.   

    这个其实很简单,但我不知道怎么表达才能让你更易于理解.
      
    //关键是这句,   把它分两部分来解释
      Action<ISomeCallbackContract> invoke  相当于定义了一个函数指针,
    这个函数指针能指向没有返回值,带一个ISomeCallbackContract类型参数的函数.
    也就是说,假设有这么样的A,B两个函数  ,那么我就个可把A,B的函数名赋值给invoke 
      class DelegateTest{
    //没有返回值,带一个ISomeCallbackContract类型参数的函数.
     static void A(ISomeCallbackContract  callbackContract){}
     static void B(ISomeCallbackContract callbackContract){}
     static public void CallClients() {
                Action<ISomeCallbackContract> invoke ;
                    invoke=A;
                    invoke=B;
      }
       //下面这句就是 匿名函数
     delegate(ISomeCallbackContract callback) {
                    callback.SomeCallbackMethod();
    }
    它实际上正是返回值为void带一个ISomeCallbackContract的函数,只不过它没有名字.
    它相当于如下的函数
       void  匿名(ISomeCallbackContract callback)
      {
        callback.SomeCallbackMethod();
       } 
    当把这个匿名函数的值给了invoke后,以后你再看到对的调用invoke就相当于在调用这个匿名函数.
    再看下面这个回调列表,
     m_Callbacks.ForEach(invoke);
    不用说回调列表里都是ISomeCallbackContract类型对象的集合,集合里的
    元素正是invoke所需要的参数,
     ForEach是遍历每个ISomeCallbackContract对象并做为参数来调用invoke.我想你应该理解了吧
      

  2.   

    我对WCF的应用不是很多。不过,用WCF双工做在线客户服务,也就是一对多,一个客服对多个会员提供在线交流,有没有问题呢?
      

  3.   

    就是这个意思,每个客户端都会被指向回调函数,不然就不叫遍历了。那个只是演示效果,没有实际意义,你看不懂他的含义是对的,因为现实当中没人会写这样的代码,真要写出这样的代码那就是思维混乱。至于你说的一对多的通讯就不应该用双工来做,功能不一样,那个双工就好比UDP广播,QQ群,是多对多,任何人发信息,所有人都看得到,一对多要实现不是不行,而是杀鸡用牛刀了。你要自己处理请求的from-to匹配,还是要建这样的消息队列才行,还要考虑消息的离线存储(断线情况),还不如轮询服务端的消息队列,查找属于自己的最新消息更好。
      

  4.   

    构建 ForEach方法的参数,参数是一个委托,构建委托。
    循环执行这个委托方法。