.NET Remoting 经典远程回调模型(三)

         今天来说下最后一项技术,用接口来代替定制委托。

         前面讲过,定制委托时客户端传递一个实现好了的委托给服务端,

同样的道理,客户端也可传递一个实现好了接口给服务端。

看一下如何实现:

 //定义回调接口

public interface IClientCallback

{

//为了防止服务端因为阻塞而不能及时返回结果而影响

//本地执行其他任务,因此加上ONEWAY属性。

      [OneWay]

      void ResultCallback(int result);

}

public class SimpleMath:MarshalByRefObject

{

     private delegate int opDelegate(int n1, int n2);

     public delegate void ClientCallbackDelegate(int result);

     public int Add(int n1, int n2)

   {

        return n1+n2;

    }

     public void AsyncAdd(int n1,int n2,IClientCallback callback)

    {

          opDelegate op=  new opDelegate(Add);

           op.BeginInvoke(n1,n2,new AsycCallback(DoClientCallback),callback);

      }

     private void DoClientCallback(IAsyncResult ar)

     {

          AsyncResult asyncResult=(AsyncResult)ar;

          opDelegate  op= (opDelegate)asyncResult.AsyncDelegate;

         int result=op.EndInvoke(ar);

         ////// 注意下面的变动,用接口来替代委托的

         /////把从客户端获得的对象转成相对应得接口对象

         IClientCallback callback=(IClientCallback )ar.AsyncState;

         callback.ResultCallback(result);

      }

}

再看一下客户端:

我们先做一个实现 回调接口的类,这个类的实例

就是准备传输给服务端的。

//记得客户端和服务端都得引用回调接口所处的应用程序集DLL

pubic class ClientCallbackSink:MarshalByRefObject,IClientCallback 

{

     public void ResultCallback(int result)

    {

          Console.WriteLine(result.tostring());

     }

}

class ClientMain

{

     static void Main(string[] args)

     {

            RemotingConfguration.Configure("MathClient.exe.config");

           SimpleMath math= new SimpleMath();

           ClientCallbackSink callback= new ClientCallbackSink ();

           math.AsyncAdd(5,2,callbakc);

      }

}

好了,Remoting的基本回调技术就讲完了,其实,我们

也可看到,这不仅仅是Remoting问题,也为我们对待参数

的传递多了几种认识。

原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua20091205.html