Win32 RPC 編程(三)

Win32 RPC 編程(三) 示例下載編程

咱們在上一節的基礎上,討論如何實現異步的 RPC 調用。前兩節演示的函數調用都是同步的,即調用函數 Hello() 時,客戶端將阻塞住直到服務端的 Hello() 函數返回。若是服務端函數須要進行一些費時的操做,例如複雜的計算、查詢,客戶端只能一直阻塞在那裏。這種狀況下,咱們能夠使用異步的 RPC 提升客戶端的性能。異步

異步的RPC是經過配置文件(.acf)來啓用的:async

 

 原來的接口 HelloWorld 有兩個方法,Hello() 和 Shutdown(),Shutdown() 咱們仍然讓它是同步調用,因此在.acf文件中不用列出。IDL 接口文件仍是能夠不用修改。ide

服務端的代碼 server.c 中的 Hello() 要改爲下面的樣子:函數

 Cpp代碼性能

  1. void Hello(PRPC_ASYNC_STATE rpcAsyncHandle, const unsigned char * psz)   
  2. {   
  3.     // 模擬一個長時間的操做   
  4.     printf("Sleep 5 seconds...\n");   
  5.     Sleep(5000);   
  6.     printf("%s\n", psz);    
  7.     // 代表調用已經完成   
  8.   
  9.     RpcAsyncCompleteCall(rpcAsyncHandle, NULL);   
  10. }  

 服務端的其它代碼不用修改。spa

客戶端client.c中的調用方式也要換:code

 Cpp代碼server

  1. int main(int argc, char * argv[])   
  2. {   
  3.     // 前面都相同   
  4.     ...   
  5.   
  6.         // 下面是調用服務端的函數   
  7.         RpcTryExcept   
  8.     {   
  9.   
  10.         if ( _stricmp(argv[1], "SHUTDOWN") == 0 )   
  11.         {   
  12.             Shutdown();   
  13.         }   
  14.         else  
  15.         {   
  16.             // 初始化異步調用   
  17.             RPC_ASYNC_STATE async;   
  18.             RpcAsyncInitializeHandle( &async, sizeof(async) );   
  19.             async.UserInfo = NULL;   
  20.             async.NotificationType = RpcNotificationTypeNone;    
  21.   
  22.             // 本函數能當即返回   
  23.             Hello( &async, (unsigned char*)argv[1]);    
  24.   
  25.             // 查詢調用的狀態   
  26.             while ( RpcAsyncGetCallStatus(&async) == RPC_S_ASYNC_CALL_PENDING )   
  27.             {   
  28.                 printf("Call Hello() pending, wait 1s...\n");   
  29.                 Sleep(1000);   
  30.             }   
  31.   
  32.             // 通知調用已經完成   
  33.             RpcAsyncCompleteCall( &async, NULL );   
  34.         }   
  35.     }   
  36.     RpcExcept(1)   
  37.     {   
  38.         printf( "RPC Exception %d\n", RpcExceptionCode() );   
  39.     }   
  40.     RpcEndExcept   
  41.   
  42.   
  43.         // 後面都相同   
  44.         ...    
  45. }  

 

Cpp代碼
  1. Hello.acf:   
  2. [     
  3.     implicit_handle(handle_t HelloWorld_Binding)     
  4. ]     
  5.   
  6. interface  HelloWorld   
  7. {   
  8.     [async] Hello();  // 增長了 [async] 代表這是異步調用   
  9. }  
相關文章
相關標籤/搜索