今天来说下最后一项技术,用接口来代替定制委托。
前面讲过,定制委托时客户端传递一个实现好了的委托给服务端,
同样的道理,客户端也可传递一个实现好了接口给服务端。
看一下如何实现:
//定义回调接口
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问题,也为我们对待参数
的传递多了几种认识。