Win32 RPC 编程(三) 示例下载编程
咱们在上一节的基础上,讨论如何实现异步的 RPC 调用。前两节演示的函数调用都是同步的,即调用函数 Hello() 时,客户端将阻塞住直到服务端的 Hello() 函数返回。若是服务端函数须要进行一些费时的操做,例如复杂的计算、查询,客户端只能一直阻塞在那里。这种状况下,咱们能够使用异步的 RPC 提升客户端的性能。异步
异步的RPC是经过配置文件(.acf)来启用的:async
原来的接口 HelloWorld 有两个方法,Hello() 和 Shutdown(),Shutdown() 咱们仍然让它是同步调用,因此在.acf文件中不用列出。IDL 接口文件仍是能够不用修改。ide
服务端的代码 server.c 中的 Hello() 要改为下面的样子:函数
Cpp代码性能
- void Hello(PRPC_ASYNC_STATE rpcAsyncHandle, const unsigned char * psz)
- {
-
- printf("Sleep 5 seconds...\n");
- Sleep(5000);
- printf("%s\n", psz);
-
-
- RpcAsyncCompleteCall(rpcAsyncHandle, NULL);
- }
void Hello(PRPC_ASYNC_STATE rpcAsyncHandle, const unsigned char * psz)
{
// 模拟一个长时间的操做
printf("Sleep 5 seconds...\n");
Sleep(5000);
printf("%s\n", psz);
// 代表调用已经完成
RpcAsyncCompleteCall(rpcAsyncHandle, NULL);
}
服务端的其它代码不用修改。spa
客户端client.c中的调用方式也要换:code
Cpp代码server
- int main(int argc, char * argv[])
- {
-
- ...
-
-
- RpcTryExcept
- {
-
- if ( _stricmp(argv[1], "SHUTDOWN") == 0 )
- {
- Shutdown();
- }
- else
- {
-
- RPC_ASYNC_STATE async;
- RpcAsyncInitializeHandle( &async, sizeof(async) );
- async.UserInfo = NULL;
- async.NotificationType = RpcNotificationTypeNone;
-
-
- Hello( &async, (unsigned char*)argv[1]);
-
-
- while ( RpcAsyncGetCallStatus(&async) == RPC_S_ASYNC_CALL_PENDING )
- {
- printf("Call Hello() pending, wait 1s...\n");
- Sleep(1000);
- }
-
-
- RpcAsyncCompleteCall( &async, NULL );
- }
- }
- RpcExcept(1)
- {
- printf( "RPC Exception %d\n", RpcExceptionCode() );
- }
- RpcEndExcept
-
-
-
- ...
- }
- Hello.acf:
- [
- implicit_handle(handle_t HelloWorld_Binding)
- ]
-
- interface HelloWorld
- {
- [async] Hello();
- }
Hello.acf:
[
implicit_handle(handle_t HelloWorld_Binding)
]
interface HelloWorld
{
[async] Hello(); // 增长了 [async] 代表这是异步调用
}