分类

链接

2011 年 12 月
 1234
567891011
12131415161718
19202122232425
262728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET > 正文
共享办公室出租
Remoting 的异步调用
.NET 暂无评论 阅读(2,699)

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();
        }
    }
}

输出:
Client:2007-2-26 15:00:57
Server:2007-2-26 15:01:02

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:Remoting 的异步调用 | Bruce's Blog

发表评论

留言无头像?