111,096
社区成员




namespace MyClient
{
class Program
{
private delegate int MyDelegate(int a, int b, int time, string ip);
private static MyDelegate md;
static RemoteObject.MyObject app;
static RemoteObject.EventClass ec;
static DateTime dt;
static void Main(string[] args)
{
dt = DateTime.Now;
RemotingConfiguration.RegisterActivatedClientType(typeof(RemoteObject.MyObject), "tcp://localhost:8888/RemoteObject.MyObject");
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 0;
TcpChannel channel = new TcpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel);
app = new RemoteObject.MyObject();
ec = new RemoteObject.EventClass();
app.MyEvent += new RemoteObject.MyObject.MyEventHandler(ec.MyEvent);
md = new MyDelegate(app.ALongTimeMethod);
AsyncCallback ac = new AsyncCallback(MyClient.CallBack);
IPHostEntry ipHE = Dns.GetHostByName(Dns.GetHostName());
Random rnd = new Random(System.Environment.TickCount);
string ip = ipHE.AddressList[0].ToString() + "(" + rnd.Next(100000000).ToString() + ")";
app.tmp = ip;
IAsyncResult Iar = md.BeginInvoke(1, 2, 500, ip, ac, null);
Method();
Console.WriteLine("用了" + ((TimeSpan)(DateTime.Now - dt)).TotalSeconds + "秒");
ChannelServices.UnregisterChannel(channel);
Console.ReadLine();
}
public static void CallBack(IAsyncResult Iar)
{
if (Iar.IsCompleted)
{
Console.WriteLine("结果是" + md.EndInvoke(Iar));
app.MyEvent -= new RemoteObject.MyObject.MyEventHandler(ec.MyEvent);
}
}
public static void Method()
{
Console.WriteLine("主线程方法开始");
System.Threading.Thread.Sleep(5000);
Console.WriteLine("主线程方法结束");
}
}
}
//建一个RemoteObject类
using System;
namespace RemoteObject
{
[Serializable]
public class MyEventArgs : EventArgs
{
private int _rate;
private string _ip;
public int Rate
{
get
{
return _rate;
}
}
public string IP
{
get
{
return _ip;
}
}
public MyEventArgs(int rate, string ip)
{
this._rate = rate;
this._ip = ip;
}
}
public class MyObject : MarshalByRefObject
{
public delegate void MyEventHandler(object sender, MyEventArgs e);
public event MyEventHandler MyEvent;
public string tmp;
public int ALongTimeMethod(int a, int b, int time, string ip)
{
Console.WriteLine("来自" + ip + "的异步方法开始");
for (int i = 1; i <= 10; i++)
{
System.Threading.Thread.Sleep(time);
Console.WriteLine("来自" + ip + "的异步方法完成了" + i * 10 + "%");
OnMyEvent(new MyEventArgs(i, ip));
}
Console.WriteLine("来自" + ip + "的异步方法结束");
return a + b;
}
protected void OnMyEvent(MyEventArgs e)
{
if (MyEvent != null)
{
foreach (Delegate d in MyEvent.GetInvocationList())
{
try
{
((MyEventHandler)d)(this, e);
}
catch
{
MyEvent -= (MyEventHandler)d;
}
}
}
}
}
public class EventClass : MarshalByRefObject
{
public void MyEvent(object sender, MyEventArgs e)
{
if (((MyObject)sender).tmp == e.IP)
Console.WriteLine("异步方法完成了" + e.Rate * 10 + "%");
}
}
}
二、服务
using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Serialization.Formatters;
namespace WebService1
{
class Service1
{
[STAThread]
static void Main(string[] args)
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
RemotingConfiguration.ApplicationName = "RemoteObject.MyObject";
RemotingConfiguration.RegisterActivatedServiceType(typeof(RemoteObject.MyObject));
BinaryServerFormatterSinkProvider servERProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 8888;
TcpChannel channel = new TcpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel);
Console.ReadLine();
}
}
}