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(); } } }
输出:
Client:2007-2-26 15:00:57
Server:2007-2-26 15:01:02
============ 欢迎各位老板打赏~ ===========
与本文相关的文章
- · The instance of entity type ‘Customer’ cannot be tracked because another instance with the same key value for {‘Id’} is already being tracked.
- · .NET8实时更新nginx ip地址归属地
- · 解决.NET Blazor子组件不刷新问题
- · .NET8如何在普通类库中引用 Microsoft.AspNetCore
- · .NET8 Mysql SSL error
- · ASP.NET Core MVC的Razor视图渲染中文乱码的问题
- · .NETCORE 依赖注入服务生命周期
- · asp.net zero改mysql
- · .NET5面试汇总
- · .Net连接Mysql数据库的Convert Zero Datetime日期问题
- · vue使用element-ui中的Message 、MessageBox 、Notification
- · Asp.Net Core Filter 深入浅出的那些事-AOP