@@ -1235,7 +1235,7 @@ public Client(string libPath = "")
12351235 _WatchCallbackDelegate = _WatchCallback ;
12361236 _WatchEventCallbackDelegate = _WatchEventCallback ;
12371237 _DropCollectionCallbackDelegate = _DropCollectionCallback ;
1238- _QueueEventCallbackDelegate = _QueueEventCallback ;
1238+ _QueueEventCallbackDelegate = _QueueEventCallbackWrapper ;
12391239 _ExchangeEventCallbackDelegate = _ExchangeEventCallback ;
12401240 _RpcResponseCallbackDelegate = _RpcResponseCallback ;
12411241 _CustomCommandCallbackDelegate = _CustomCommandCallback ;
@@ -3086,7 +3086,11 @@ public void UnWatch(string watchid)
30863086 Marshal . FreeHGlobal ( watchidPtr ) ;
30873087 }
30883088 }
3089- IntPtr _QueueEventCallback ( IntPtr QueueEventWrapperptr )
3089+ private IntPtr _QueueEventCallbackWrapper ( IntPtr QueueEventWrapperptr )
3090+ {
3091+ return _QueueEventCallback ( QueueEventWrapperptr ) . GetAwaiter ( ) . GetResult ( ) ;
3092+ }
3093+ private async Task < IntPtr > _QueueEventCallback ( IntPtr QueueEventWrapperptr )
30903094 {
30913095 try
30923096 {
@@ -3115,6 +3119,26 @@ IntPtr _QueueEventCallback(IntPtr QueueEventWrapperptr)
31153119 {
31163120 return Marshal . StringToHGlobalAnsi ( result ) ;
31173121 }
3122+ } else if ( QueueFuncRegistry . TryGetCallback < QueueEvent , Task < string > > ( eventObj . request_id , out var asyncFuncHandler ) )
3123+ {
3124+ if ( asyncFuncHandler == null )
3125+ {
3126+ return IntPtr . Zero ;
3127+ }
3128+ var queueEvent = new QueueEvent
3129+ {
3130+ queuename = Marshal . PtrToStringAnsi ( eventObj . queuename ) ?? string . Empty ,
3131+ correlation_id = Marshal . PtrToStringAnsi ( eventObj . correlation_id ) ?? string . Empty ,
3132+ replyto = Marshal . PtrToStringAnsi ( eventObj . replyto ) ?? string . Empty ,
3133+ routingkey = Marshal . PtrToStringAnsi ( eventObj . routingkey ) ?? string . Empty ,
3134+ exchangename = Marshal . PtrToStringAnsi ( eventObj . exchangename ) ?? string . Empty ,
3135+ data = Marshal . PtrToStringAnsi ( eventObj . data ) ?? string . Empty ,
3136+ } ;
3137+ var result = await asyncFuncHandler ( queueEvent ) ;
3138+ if ( ! string . IsNullOrEmpty ( result ) )
3139+ {
3140+ return Marshal . StringToHGlobalAnsi ( result ) ;
3141+ }
31183142 }
31193143 return IntPtr . Zero ;
31203144 }
@@ -3129,7 +3153,7 @@ IntPtr _QueueEventCallback(IntPtr QueueEventWrapperptr)
31293153 }
31303154 }
31313155
3132- public string RegisterQueue ( string queuename , Func < QueueEvent , string > eventHandler )
3156+ public string RegisterQueue ( string queuename , Func < QueueEvent , Task < string > > eventHandler )
31333157 {
31343158 if ( eventHandler == null ) throw new ArgumentNullException ( nameof ( eventHandler ) ) ;
31353159 IntPtr queuenamePtr = Marshal . StringToHGlobalAnsi ( queuename ) ;
@@ -3172,7 +3196,7 @@ public string RegisterQueueAction(string queuename, Action<QueueEvent> eventHand
31723196 {
31733197 return RegisterQueue ( queuename , ( queueEvent ) => {
31743198 eventHandler ( queueEvent ) ;
3175- return string . Empty ;
3199+ return Task . FromResult ( string . Empty ) ;
31763200 } ) ;
31773201 }
31783202
0 commit comments