Remoting之异步操作模式

matinal:SAP ABAP 函数异步调用总结(三) 在SAP的应用开发中 阅读详情
如果你还不知道什么是异步也不要紧,我们还是来看实例,通过实例来理解才是最深刻的。
在Remoting中,我们可以使用以下几种异步的方式:
1、普通异步
2、回调异步
3、单向异步
一个一个来说,首先我们这么修改我们的远程对象:
public   int  ALongTimeMethod( int  a, int  b, int  time)
        {
            Console.WriteLine(
" 异步方法开始 " );
            System.Threading.Thread.Sleep(time);
            Console.WriteLine(
" 异步方法结束 " );
            
return  a + b;
        }

这个方法传入2个参数,返回2个参数和表示方法执行成功,方法需要time毫秒的执行时间,这是一个长时间的方法。
如果方法我们通过异步远程调用,这里需要注意到这个方法输出的行是在服务器端输出的而不是客户端。因此,为了测试简单,我们还是在采用本地对象,在实现异步前我们先来看看同步的调用方法,为什么说这是一种阻塞?因为我们调用了方法主线程就在等待了,看看测试:
DateTime dt = DateTime.Now;
RemoteObject.MyObject app
= new  RemoteObject.MyObject();
Console.WriteLine(app.ALongTimeMethod(
1 , 2 , 1000 ));
            Method();
            Console.WriteLine(
" 用了 " + ((TimeSpan)(DateTime.Now - dt)).TotalSeconds + " 秒 " );
            Console.ReadLine();

假设method方法是主线程的方法,需要3秒的时间:
private   static   void  Method()
        {
            Console.WriteLine(
" 主线程方法开始 " );
            System.Threading.Thread.Sleep(
3000 );
            Console.WriteLine(
" 主线程方法结束 " );
        }

好了,现在开始运行程序:


用了4秒,说明在我们的方法开始以后本地就一直在等待了,总共用去的时间=本地方法+远程方法,对于长时间方法调用这显然不科学!我们需要改进:

1、普通异步:
首先在main方法前面加上委托,签名和返回类型和异步方法一致。
private   delegate   int  MyDelegate( int  a, int  b, int  time);

main方法里面这么写:
DateTime dt = DateTime.Now;
RemoteObject.MyObject app
= new  RemoteObject.MyObject();
MyDelegate md
= new  MyDelegate(app.ALongTimeMethod);
  IAsyncResult Iar
= md.BeginInvoke( 1 , 2 , 1000 , null , null );
Method();    
if ( ! Iar.IsCompleted)
{
Iar.AsyncWaitHandle.WaitOne();        
}
else
{
Console.WriteLine(
" 结果是 " + md.EndInvoke(Iar));
}
Console.WriteLine(
" 用了 " + ((TimeSpan)(DateTime.Now - dt)).TotalSeconds + " 秒 " );
Console.ReadLine();

来看一下执行结果:


现在总共执行时间接近于主线程的执行时间了,等于是调用方法基本不占用时间。
分析一下代码:Iar.AsyncWaitHandle.WaitOne(); 是阻塞等待异步方法完成,在这里这段代码是不会被执行的,因为主方法完成的时候,异步方法早就IsCompleted了,如果我们修改一下代码:IAsyncResult Iar=md.BeginInvoke(1,2,5000,null,null);


可以看到,主线程方法结束后就在等待异步方法完成了,总共用去了接近于异步方法的时间:5秒。

在实际的运用中,主线程往往需要得到异步方法的结果,也就是接近于上述的情况,我们在主线程做了少量时间的工作以后最终要是要WaitOne去等待异步操作返回的结果,才能继续主线程操作。看第二个图可以发现,异步操作仅仅用了1秒,但是要等待3秒的主线程方法完成后再返回结果,这还是不科学啊。因此,我们要使用委托回调的异步技术。

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

ABAP中的同步和异步调用 ABAP的CALLFUNCTION类似于Java/.NET中的本地或远程方法调用。CALLFUNCTION 可以分为四种:1.SynchronousRFC(sRFC)-同步调用2.AsynchronousRFC(aRFC)-异步调用3.TransactionalRFC(tRFC)-保证Transaction数据一致性的调用4.QueuedRFC... 阅读详情

相关推荐

ABAP 函数介绍

有点介绍SAP 函数调用的方法,包含同步调用,异步调用

(原创)一步一步学Remoting之五:异步操作

                          一步一步学Remoting之五:异步操作如果你还不知道什么是异步也不要紧,我们还是来看实例,通过实例来理解才是最深刻的。在Remoting中,我们可以使用以下几种异步的方式:1、普通异步2、回调异步3、单向异步一个一个来说,首先我们这么修改我们的远程对象:public int ALongTimeMethod(int a,int 

558

蓝牙开发那些事之ceva controller代码解读

对比ceva的经典蓝牙和ble的controller在软件上的差异点

袁赟的博客 1094

SAP ABAP 中的异步调用

举例场景:创建采购申请的接口中,在执行完BAPI之后返回了一个PR,接着就会执行到commit提交的接口,然如果还需要在创建的时候直接审批,那么就需要再调用PR审批的BAPI。但是你会发现有的PR,在ME23N查看的时候是审批状态,而有的并未审批。原因:因为程序在执行的时候,也就是commit的时候,还并未提交到数据库中,而后就直接执行了审批的流程。在开发的角度来说,这是同步执行的“后果”。解决:既然知道了是同步导致的,数据没有及时更新到数据库,那么就可以找到对应的解决办法。

专注 SAP ABAP 开发,5 年一线项目经验 博客记录日常开发踩坑、语法实践、性能优化、实战案例。 分享可复用的代码片段、排错思路,持续沉淀 SAP 开发干货。 提供远程技术支持与项目开发服务。 2763

微信小游戏CE修改实战:从入门到精通(附防作弊思路)

本文深入探讨微信小游戏的安全攻防实战,重点分析CE修改、反编译和重打包等安全风险。通过详细的内存修改案例和代码保护方案对比,提供从客户端到服务端的全方位防护策略,帮助开发者构建有效的防作弊体系。

m2n3b4v5c6的博客 1157

Matlab PolySpace 静态分析实战:从零搭建嵌入式代码安全防线

本文详细介绍了如何使用Matlab PolySpace进行嵌入式代码静态分析,从环境搭建到实战配置,帮助开发者提前发现内存溢出、未初始化变量等潜在缺陷。通过案例分享和进阶技巧,展示如何提升代码安全性和可靠性,特别适合汽车ECU、医疗设备等安全关键系统开发。

weixin_33701617的博客 603

ABAP_RFC异步调用(多线程)

CALLFUNCTION'ZMM_MODIFY_PO' STARTINGNEWTASK'Task1'"DESTINATIONINGROUPserv_group "performingsub_fm_back5onendoftask EXPORTING lv_ebeln=ekko-ebeln TABLES return=lt_return ...

qq_24436015的博客 1350

Openwork 入门指南:开源 AI 桌面助手快速上手

Openwork是一款开源的AI桌面代理工具,提供类似Claude Cowork的免费替代方案。它支持本地运行,确保隐私安全,并能高效处理文件整理、文档读写等任务。支持多种AI模型,通过MIT许可完全免费。安装简单,仅需运行命令行或下载桌面版,需配置API Key后即可使用。操作直观,支持多步骤规划和权限控制,适合自动化重复工作。目前主要支持macOS,未来将扩展至Windows/Linux。建议从简单任务入手,逐步掌握这一高效的数字助手工具。

3806

一步一步学Remoting系列文章

(原创)一步一步学Remoting之一:从简单开始 (原创)一步一步学Remoting之二:激活模式 (原创)一步一步学Remoting之三:复杂对象 (原创)一步一步学Remoting之四:承载方式(1) (原创)一步一步学Remoting之四:承载方式(2) (原创)一步一步学Remoting之五:异步操作 (原创)一步一步学Remoting之六:事件(1) (原创)一步一步学Rem

469

从零搭建工业质检系统:基于YOLOv11的产线瑕疵与不合格品自动检测全流程实战(小白指南+疑难解答)

工业质检项目的每一步,都是“技术逻辑→工业需求→商业价值”的闭环验证。当你看到自己开发的系统能在产线中精准识别每一处瑕疵,为工厂节省大量成本时,那种“技术创造真实价值”的成就感,会让你明白深度学习不止是算法论文,更是产业升级的引擎。如果过程中遇到模型在产线环境下精度下降、UI系统抗干扰性不足等问题,不妨从“工业场景特殊性”(如光照变化、产品反光、产线振动)入手拆解分析,再针对性优化数据或模型。记住,每解决一个工业场景的问题,你就离“能驾驭产业AI的工程师”更近一步。

FJN110的博客 127

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

WW、forever的博客 287

Remoting的一些文章索引,方便阅读 (狂好的,值得收藏的好文啊)

一步一步学Remoting之一:从简单开始 一步一步学Remoting之二:激活模式 一步一步学Remoting之三:复杂对象 一步一步学Remoting之四:承载方式(1) 一步一步学Remoting之四:承载方式(2) 一步一步学Remoting之五:异步操作 一步一步学Remoting之六:事件(1) 一步一步学Remoting之六:事件(2)

净心编程 1320

Tiktok/抖音旋转验证码

主要记录一下旋转验证码的逆向思路

记录一些web逆向的过程 5978

Remoting的一些文章索引,方便阅读

本站Remoting的一些文章索引,方便阅读 (原创)一步一步学Remoting之一:从简单开始 (原创)一步一步学Remoting之二:激活模式 (原创)一步一步学Remoting之三:复杂对象 (原创)一步一步学Remoting之四:承载方式(1) (原创)一步一步学Remoting之四:承载方式(2) (原创)一步一步学Remoting之五:异步操作 (原创)一步一步学Remoting之...

weixin_30608131的博客 62

openmediavault(OMV)(30)插件介绍(3)filebrowser文件管理器

filebrowser可以对omv的文件进行图形化管理,而不需要每次都通过命令进行修改。filebrowser安装。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2321

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: RemotingIIS承载方式
下一篇: Remoting的事件机制(带具体例子)
JavaProgramers
博客等级 码龄22年 660粉丝 304原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值