Remoting 的异步调用和单个应用程序域异步编程基本相同。
Remoting 的异步调用和单个应用程序域异步编程基本相同。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.Security.Permissions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Lifetime;
using System.Runtime.Remoting.Services;

namespace Learn.Library.Remoting


{
public class RemotingTest2

{
public delegate int AddHandler(int a, int b);


/**//// <summary>
/// 远程类型
/// </summary>
public class Data : MarshalByRefObject

{
public int Add(int a, int b)

{
return a + b;
}
}


/**//// <summary>
/// 服务器端代码
/// </summary>
static void Server()

{
AppDomain server = AppDomain.CreateDomain("server");
server.DoCallBack(delegate

{
TcpServerChannel channel = new TcpServerChannel(801);
ChannelServices.RegisterChannel(channel, false);

RemotingConfiguration.ApplicationName = "test";
RemotingConfiguration.RegisterActivatedServiceType(typeof(Data));
});
}


/**//// <summary>
/// 客户端代码
/// </summary>
static void Client()

{
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterActivatedClientType(typeof(Data), "tcp://localhost:801/test");

Data data = new Data();

AddHandler add = new AddHandler(data.Add);
IAsyncResult ar = add.BeginInvoke(1, 2, null, null);
ar.AsyncWaitHandle.WaitOne();
Console.WriteLine(add.EndInvoke(ar));
}

static void Main()

{
Server();
Client();
}
}
}

我们还可以为方法添加 OneWayAttribute 特性使其成为单向方法来完成类似的异步方法调用。

不过 [OneWary] 有一些条件限制:
1. 该方法无返回值和 out 或 ref 参数。
2. 该方法不能引发任何异常

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.Security.Permissions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Lifetime;
using System.Runtime.Remoting.Services;

namespace Learn.Library.Remoting


{
public class RemotingTest2

{
public delegate void TestHandler();


/**//// <summary>
/// 远程类型
/// </summary>
public class Data : MarshalByRefObject

{
[OneWay]
public void Test()

{
Thread.Sleep(5000);
Console.WriteLine("Server:{0}", DateTime.Now);
}
}


/**//// <summary>
/// 服务器端代码
/// </summary>
static void Server()

{
AppDomain server = AppDomain.CreateDomain("server");
server.DoCallBack(delegate

{
TcpServerChannel channel = new TcpServerChannel(801);
ChannelServices.RegisterChannel(channel, false);

RemotingConfiguration.ApplicationName = "test";
RemotingConfiguration.RegisterActivatedServiceType(typeof(Data));
});
}


/**//// <summary>
/// 客户端代码
/// </summary>
static void Client()

{
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterActivatedClientType(typeof(Data), "tcp://localhost:801/test");

Data data = new Data();
data.Test();
Console.WriteLine("Client:{0}", DateTime.Now);
}

static void Main()

{
Server();
Client();
}
}
}

posted on
2007-06-05 09:24
编程山人
阅读(
336)
评论()
收藏
举报