@@ -18,6 +18,7 @@ public sealed partial class NetworkManager
1818 public partial class RpcState : IDisposable
1919 {
2020 private readonly ConcurrentDictionary < long , RpcMessageData > m_HandlingObjects = new ConcurrentDictionary < long , RpcMessageData > ( ) ;
21+ private readonly GameFrameworkLinkedList < MessageObject > m_ExecutionMessageLinkedList = new GameFrameworkLinkedList < MessageObject > ( ) ;
2122 private readonly HashSet < long > m_HandlingObjectIds = new HashSet < long > ( ) ;
2223 private EventHandler < MessageObject > m_RpcStartHandler ;
2324 private EventHandler < MessageObject > m_RpcEndHandler ;
@@ -50,24 +51,42 @@ public void Dispose()
5051 /// 处理RPC回复消息。
5152 /// 此方法用于处理接收到的RPC回复消息,并触发相应的结束处理程序。
5253 /// </summary>
53- /// <param name="message">要处理的消息对象,必须实现IResponseMessage接口。</param>
5454 /// <returns>如果成功处理回复消息,则返回true;否则返回false。</returns>
55- public bool Reply ( MessageObject message )
55+ private void InvokingReplyRpcMessage ( )
5656 {
57- if ( message . GetType ( ) . IsImplWithInterface ( typeof ( IResponseMessage ) ) )
57+ while ( m_ExecutionMessageLinkedList . First != null )
5858 {
59- if ( m_HandlingObjects . TryRemove ( message . UniqueId , out var messageActorObject ) )
59+ var messageObject = m_ExecutionMessageLinkedList . First . Value ;
60+
61+ if ( m_HandlingObjects . TryRemove ( messageObject . UniqueId , out var messageActorObject ) )
6062 {
6163 try
6264 {
63- messageActorObject . Reply ( message as IResponseMessage ) ;
64- m_RpcEndHandler ? . Invoke ( this , message ) ;
65+ messageActorObject . Reply ( messageObject as IResponseMessage ) ;
66+ m_RpcEndHandler ? . Invoke ( this , messageObject ) ;
6567 }
6668 catch ( Exception e )
6769 {
6870 Log . Fatal ( e ) ;
6971 }
72+ }
73+ m_ExecutionMessageLinkedList . RemoveFirst ( ) ;
74+ }
75+ }
7076
77+ /// <summary>
78+ /// 处理RPC回复消息。
79+ /// 此方法用于处理接收到的RPC回复消息,并触发相应的结束处理程序。
80+ /// </summary>
81+ /// <param name="message">要处理的消息对象,必须实现IResponseMessage接口。</param>
82+ /// <returns>如果成功处理回复消息,则返回true;否则返回false。</returns>
83+ public bool TryReply ( MessageObject message )
84+ {
85+ if ( message . GetType ( ) . IsImplWithInterface ( typeof ( IResponseMessage ) ) )
86+ {
87+ if ( m_HandlingObjects . TryGetValue ( message . UniqueId , out _ ) )
88+ {
89+ m_ExecutionMessageLinkedList . AddLast ( message ) ;
7190 return true ;
7291 }
7392 }
@@ -105,6 +124,8 @@ public Task<IResponseMessage> Call(MessageObject messageObject)
105124
106125 public void Update ( float elapseSeconds , float realElapseSeconds )
107126 {
127+ InvokingReplyRpcMessage ( ) ;
128+
108129 if ( m_HandlingObjects . Count > 0 )
109130 {
110131 var elapseSecondsTime = ( long ) ( elapseSeconds * 1000 ) ;
0 commit comments