Skip to content

Commit 804cb5f

Browse files
committed
[增加]1. 增加RPC 事件回调的异常捕获
1 parent c299a12 commit 804cb5f

File tree

4 files changed

+135
-87
lines changed

4 files changed

+135
-87
lines changed

Runtime/Network/Network/NetworkManager.HeartBeatState.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ public HeartBeatState()
2828
/// </summary>
2929
public float HeartBeatElapseSeconds
3030
{
31-
get => _heartBeatElapseSeconds;
32-
set => _heartBeatElapseSeconds = value;
31+
get { return _heartBeatElapseSeconds; }
32+
set { _heartBeatElapseSeconds = value; }
3333
}
3434

3535
/// <summary>
3636
/// 心跳丢失次数
3737
/// </summary>
3838
public int MissHeartBeatCount
3939
{
40-
get => _missHeartBeatCount;
41-
set => _missHeartBeatCount = value;
40+
get { return _missHeartBeatCount; }
41+
set { _missHeartBeatCount = value; }
4242
}
4343

4444
/// <summary>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using GameFrameX.Runtime;
4+
5+
namespace GameFrameX.Network.Runtime
6+
{
7+
public partial class NetworkManager
8+
{
9+
public partial class RpcState : IDisposable
10+
{
11+
internal sealed class RpcMessageData : IDisposable
12+
{
13+
/// <summary>
14+
/// 消息的唯一ID
15+
/// </summary>
16+
public long UniqueId { get; }
17+
18+
/// <summary>
19+
/// 创建时间
20+
/// </summary>
21+
public long CreatedTime { get; }
22+
23+
/// <summary>
24+
/// 消耗的时间
25+
/// </summary>
26+
public long ElapseTime { get; private set; }
27+
28+
/// <summary>
29+
/// 请求消息
30+
/// </summary>
31+
public IRequestMessage RequestMessage { get; protected set; }
32+
33+
/// <summary>
34+
/// 超时时间。单位毫秒
35+
/// </summary>
36+
public int Timeout { get; }
37+
38+
/// <summary>
39+
/// 响应消息
40+
/// </summary>
41+
public IResponseMessage ResponseMessage { get; protected set; }
42+
43+
/// <summary>
44+
/// 设置等待的返回结果
45+
/// </summary>
46+
/// <param name="responseMessage"></param>
47+
public void Reply(IResponseMessage responseMessage)
48+
{
49+
ResponseMessage = responseMessage;
50+
m_Tcs.SetResult(responseMessage);
51+
}
52+
53+
/// <summary>
54+
/// 增加时间。如果超时返回true
55+
/// </summary>
56+
/// <param name="time"></param>
57+
/// <returns></returns>
58+
internal bool IncrementalElapseTime(long time)
59+
{
60+
ElapseTime += time;
61+
if (ElapseTime >= Timeout)
62+
{
63+
m_Tcs.TrySetException(new TimeoutException("Rpc call timeout! Message is :" + RequestMessage));
64+
return true;
65+
}
66+
67+
return false;
68+
}
69+
70+
/// <summary>
71+
/// 创建RPC 消息数据对象
72+
/// </summary>
73+
/// <param name="actorRequestMessage"></param>
74+
/// <param name="timeout"></param>
75+
/// <returns></returns>
76+
internal static RpcMessageData Create(IRequestMessage actorRequestMessage, int timeout = 5000)
77+
{
78+
var defaultMessageActorObject = new RpcMessageData(actorRequestMessage, timeout);
79+
return defaultMessageActorObject;
80+
}
81+
82+
private RpcMessageData(IRequestMessage requestMessage, int timeout)
83+
{
84+
CreatedTime = GameTimeHelper.UnixTimeMilliseconds();
85+
RequestMessage = requestMessage;
86+
Timeout = timeout;
87+
UniqueId = ((MessageObject)requestMessage).UniqueId;
88+
m_Tcs = new TaskCompletionSource<IResponseMessage>();
89+
}
90+
91+
private readonly TaskCompletionSource<IResponseMessage> m_Tcs;
92+
93+
public Task<IResponseMessage> Task
94+
{
95+
get { return m_Tcs.Task; }
96+
}
97+
98+
public void Dispose()
99+
{
100+
GC.SuppressFinalize(this);
101+
}
102+
}
103+
}
104+
}
105+
}

Runtime/Network/Network/NetworkManager.RpcState.RpcMessageData.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/Network/Network/NetworkManager.RpcState.cs

Lines changed: 23 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace GameFrameX.Network.Runtime
1515
{
1616
public sealed partial class NetworkManager
1717
{
18-
public sealed class RpcState : IDisposable
18+
public partial class RpcState : IDisposable
1919
{
2020
private readonly ConcurrentDictionary<long, RpcMessageData> m_HandlingObjects = new ConcurrentDictionary<long, RpcMessageData>();
2121
private readonly HashSet<long> m_HandlingObjectIds = new HashSet<long>();
@@ -48,8 +48,15 @@ public bool Reply(MessageObject message)
4848
if (m_HandlingObjects.TryRemove(message.UniqueId, out var messageActorObject))
4949
{
5050
messageActorObject.Reply(message as IResponseMessage);
51-
m_RpcEndHandler?.Invoke(this, message);
52-
return true;
51+
try
52+
{
53+
m_RpcEndHandler?.Invoke(this, message);
54+
return true;
55+
}
56+
catch (Exception e)
57+
{
58+
Log.Fatal(e);
59+
}
5360
}
5461
}
5562

@@ -70,90 +77,16 @@ public Task<IResponseMessage> Call(MessageObject messageObject)
7077

7178
var defaultMessageActorObject = RpcMessageData.Create(messageObject as IRequestMessage);
7279
m_HandlingObjects.TryAdd(messageObject.UniqueId, defaultMessageActorObject);
73-
m_RpcStartHandler?.Invoke(this, messageObject);
74-
return defaultMessageActorObject.Task;
75-
}
76-
77-
class RpcMessageData
78-
{
79-
/// <summary>
80-
/// 消息的唯一ID
81-
/// </summary>
82-
public long UniqueId { get; }
83-
84-
/// <summary>
85-
/// 创建时间
86-
/// </summary>
87-
public long CreatedTime { get; }
88-
89-
/// <summary>
90-
/// 消耗的时间
91-
/// </summary>
92-
public long ElapseTime { get; private set; }
93-
94-
/// <summary>
95-
/// 请求消息
96-
/// </summary>
97-
public IRequestMessage RequestMessage { get; protected set; }
98-
99-
/// <summary>
100-
/// 超时时间。单位毫秒
101-
/// </summary>
102-
public int Timeout { get; }
103-
104-
/// <summary>
105-
/// 响应消息
106-
/// </summary>
107-
public IResponseMessage ResponseMessage { get; protected set; }
108-
109-
/// <summary>
110-
/// 设置等待的返回结果
111-
/// </summary>
112-
/// <param name="responseMessage"></param>
113-
public void Reply(IResponseMessage responseMessage)
80+
try
11481
{
115-
ResponseMessage = responseMessage;
116-
m_Tcs.SetResult(responseMessage);
82+
m_RpcStartHandler?.Invoke(this, messageObject);
11783
}
118-
119-
/// <summary>
120-
/// 增加时间。如果超时返回true
121-
/// </summary>
122-
/// <param name="time"></param>
123-
/// <returns></returns>
124-
internal bool IncrementalElapseTime(long time)
125-
{
126-
ElapseTime += time;
127-
if (ElapseTime >= Timeout)
128-
{
129-
m_Tcs.TrySetException(new TimeoutException("Rpc call timeout! Message is :" + RequestMessage));
130-
return true;
131-
}
132-
133-
return false;
134-
}
135-
136-
internal static RpcMessageData Create(IRequestMessage actorRequestMessage, int timeout = 5000)
84+
catch (Exception e)
13785
{
138-
var defaultMessageActorObject = new RpcMessageData(actorRequestMessage, timeout);
139-
return defaultMessageActorObject;
86+
Log.Fatal(e);
14087
}
14188

142-
private RpcMessageData(IRequestMessage requestMessage, int timeout)
143-
{
144-
CreatedTime = GameTimeHelper.UnixTimeMilliseconds();
145-
RequestMessage = requestMessage;
146-
Timeout = timeout;
147-
UniqueId = ((MessageObject)requestMessage).UniqueId;
148-
m_Tcs = new TaskCompletionSource<IResponseMessage>();
149-
}
150-
151-
private readonly TaskCompletionSource<IResponseMessage> m_Tcs;
152-
153-
public Task<IResponseMessage> Task
154-
{
155-
get { return m_Tcs.Task; }
156-
}
89+
return defaultMessageActorObject.Task;
15790
}
15891

15992
public void Update(float elapseSeconds, float realElapseSeconds)
@@ -167,8 +100,15 @@ public void Update(float elapseSeconds, float realElapseSeconds)
167100
bool isTimeout = handlingObject.Value.IncrementalElapseTime(elapseSecondsTime);
168101
if (isTimeout)
169102
{
170-
m_RpcErrorHandler?.Invoke(this, handlingObject.Value.RequestMessage as MessageObject);
171103
m_HandlingObjectIds.Add(handlingObject.Key);
104+
try
105+
{
106+
m_RpcErrorHandler?.Invoke(this, handlingObject.Value.RequestMessage as MessageObject);
107+
}
108+
catch (Exception e)
109+
{
110+
Log.Fatal(e);
111+
}
172112
}
173113
}
174114
}

0 commit comments

Comments
 (0)