科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[冷枫]Remoting之异步操作模式

[冷枫]Remoting之异步操作模式

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Remoting之异步操作模式

作者:冷枫 来源:CSDN 2007年9月23日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

2、回调异步:
class MyClient
    {
        
private delegate int MyDelegate(int a,int b,int time);
        
private static MyDelegate md;

        [STAThread]
        
static void Main(string[] args)
        {
            DateTime dt
=DateTime.Now;
            
//RemoteObject.MyObject app=(RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            RemoteObject.MyObject app=new RemoteObject.MyObject();
            md
=new MyDelegate(app.ALongTimeMethod);
            AsyncCallback ac
=new AsyncCallback(MyClient.CallBack);
            IAsyncResult Iar
=md.BeginInvoke(1,2,1000,ac,null);
            Method();    
            Console.WriteLine(
"用了"+((TimeSpan)(DateTime.Now-dt)).TotalSeconds+"");
            Console.ReadLine();
        }

        
public static void CallBack(IAsyncResult Iar)
        {
            
if(Iar.IsCompleted)
            {
                Console.WriteLine(
"结果是"+md.EndInvoke(Iar));
            }
        }

        
private static void Method()
        {
            Console.WriteLine(
"主线程方法开始");
            System.Threading.Thread.Sleep(
3000);
            Console.WriteLine(
"主线程方法结束");
        }
    }

可以看到我上面的注释行,去掉远程调用的注释,对下面的本地调用注释,编译后启动服务端,再启动客户端就是远程调用了。



异步调用结束,立即就能显示出结果,如果开启远程方法的话,可以看的更加清晰:
客户端:主线程方法开始-》服务端:异步方法开始-》服务端:异步方法结束-》客户端:结果是3-》客户端:主线程方法结束-》客户端:用了3.03125秒。

3、单向异步就是像同步调用方法那样调用方法,方法却是异步完成的,但是不能获得方法的返回值而且不能像同步方法那样取得所调用方法的异常信息!对于不需要返回信息的长时间方法,我们可以放手让它去干就行了:

远程对象:

using System; 
using System.Runtime.Remoting.Messaging;

namespace RemoteObject 

    
public class MyObject:MarshalByRefObject 
    {
        [OneWay]
        
public void ALongTimeMethodOneWay(int time)
        {
            Console.WriteLine(
"异步方法开始");
            System.Threading.Thread.Sleep(time);
            Console.WriteLine(
"异步方法结束");
        }
    }        

[OneWay]属性是Remoting.Messaging的一部分,别忘记using,下面看看客户端代码:

using System;

namespace RemoteClient
{
    
class MyClient
    {
        [STAThread]
        
static void Main(string[] args)
        {
            DateTime dt
=DateTime.Now;
            RemoteObject.MyObject app
=(RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            
//RemoteObject.MyObject app=new RemoteObject.MyObject();
            app.ALongTimeMethodOneWay(1000);
            Method();
            Console.WriteLine(
"用了"+((TimeSpan)(DateTime.Now-dt)).TotalSeconds+"");
            Console.ReadLine();
        }

        
private static void Method()
        {
            Console.WriteLine(
"主线程方法开始");
            System.Threading.Thread.Sleep(
3000);
            Console.WriteLine(
"主线程方法结束");
        }
    }
}

这次我们仅仅只能在远程调试,我们先让异步方法去做,然后就放心的做主线程的事情,其他不管了。

运行结果我描述一下:
客户端:主线程方法开始-》服务端:异步方法开始-》服务端:异步方法结束-》客户端:主线程方法结束-》客户端:用了3.8秒。

上面说的三种方法,只是异步编程的一部分,具体怎么异步调用远程方法要结合实际的例子,看是否需要用到方法的返回和主线程方法的运行时间与远程方法运行时间等结合起来考虑,比如上述的WaitHandle也可以用轮询来实现:
while(Iar.IsCompleted==false) System.Threading.Thread.Sleep(10);总的来说远程对象的异步操作和本地对象的异步操作是非常接近。

还可以参考msdn相关文章:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconasynchronousprogrammingdesignpattern2.asp



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=727806

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章