Skip to content

Commit b8f9830

Browse files
committed
refactor(web): 将 WebJsonData 改用引用池模式
WebJsonData 改为工厂方法 Create() + Clear() 模式, WebManager 中 Dispose() 替换为 ReferencePool.Release()。 GameFrameX/com.gameframex.unity#5
1 parent 8a4d754 commit b8f9830

2 files changed

Lines changed: 122 additions & 55 deletions

File tree

Lines changed: 110 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
using System;
21
using System.Collections.Generic;
32
using System.Threading.Tasks;
3+
using GameFrameX.Runtime;
44

55
namespace GameFrameX.Web.Runtime
66
{
@@ -11,101 +11,162 @@ public partial class WebManager
1111
/// </summary>
1212
private sealed class WebJsonData : WebData
1313
{
14+
private Dictionary<string, string> m_Header;
15+
private Dictionary<string, object> m_Form;
16+
1417
/// <summary>
1518
/// 获取请求头信息
1619
/// </summary>
17-
public Dictionary<string, string> Header { get; }
20+
public Dictionary<string, string> Header { get { return m_Header; } }
1821

1922
/// <summary>
2023
/// 获取表单数据
2124
/// </summary>
22-
public Dictionary<string, object> Form { get; }
25+
public Dictionary<string, object> Form { get { return m_Form; } }
2326

2427
/// <summary>
2528
/// 字符串结果的任务完成源
2629
/// </summary>
27-
public readonly TaskCompletionSource<WebStringResult> UniTaskCompletionStringSource;
30+
public TaskCompletionSource<WebStringResult> UniTaskCompletionStringSource { get; private set; }
2831

2932
/// <summary>
3033
/// 字节数组结果的任务完成源
3134
/// </summary>
32-
public readonly TaskCompletionSource<WebBufferResult> UniTaskCompletionBytesSource;
35+
public TaskCompletionSource<WebBufferResult> UniTaskCompletionBytesSource { get; private set; }
3336

3437
/// <summary>
35-
/// 初始化Web JSON请求数据(用于字节数组结果的GET/POST请求
38+
/// 无参构造函数(ReferencePool 需要new约束
3639
/// </summary>
37-
/// <param name="url">请求URL</param>
38-
/// <param name="header">请求头信息</param>
39-
/// <param name="isGet">是否为GET请求</param>
40-
/// <param name="source">字节数组结果的任务完成源</param>
41-
/// <param name="userData">用户自定义数据</param>
42-
public WebJsonData(string url, Dictionary<string, string> header, bool isGet, TaskCompletionSource<WebBufferResult> source, object userData = null) : base(isGet, url, userData)
43-
{
44-
Header = header;
45-
UniTaskCompletionBytesSource = source;
46-
}
40+
public WebJsonData() { }
4741

4842
/// <summary>
49-
/// 初始化Web JSON请求数据(用于字符串结果的GET/POST请求)
43+
/// 创建用于字节数组结果的GET/POST请求数据
5044
/// </summary>
51-
/// <param name="url">请求URL</param>
52-
/// <param name="header">请求头信息</param>
53-
/// <param name="isGet">是否为GET请求</param>
54-
/// <param name="source">字符串结果的任务完成源</param>
55-
/// <param name="userData">用户自定义数据</param>
56-
public WebJsonData(string url, Dictionary<string, string> header, bool isGet, TaskCompletionSource<WebStringResult> source, object userData = null) : base(isGet, url, userData)
45+
public static WebJsonData Create(string url, Dictionary<string, string> header, bool isGet, TaskCompletionSource<WebBufferResult> source, object userData)
5746
{
58-
Header = header;
59-
UniTaskCompletionStringSource = source;
47+
var data = ReferencePool.Acquire<WebJsonData>();
48+
data.URL = url;
49+
data.IsGet = isGet;
50+
data.UserData = userData;
51+
data.UniTaskCompletionBytesSource = source;
52+
CopyHeader(data, header);
53+
return data;
6054
}
6155

6256
/// <summary>
63-
/// 初始化Web JSON请求数据(用于带表单的字符串结果POST请求)
57+
/// 创建用于字符串结果的GET/POST请求数据
6458
/// </summary>
65-
/// <param name="url">请求URL</param>
66-
/// <param name="header">请求头信息</param>
67-
/// <param name="form">表单数据</param>
68-
/// <param name="source">字符串结果的任务完成源</param>
69-
/// <param name="userData">用户自定义数据</param>
70-
public WebJsonData(string url, Dictionary<string, string> header, Dictionary<string, object> form, TaskCompletionSource<WebStringResult> source, object userData = null) : base(false, url, userData)
59+
public static WebJsonData Create(string url, Dictionary<string, string> header, bool isGet, TaskCompletionSource<WebStringResult> source, object userData)
7160
{
72-
Header = header;
73-
Form = form;
74-
UniTaskCompletionStringSource = source;
61+
var data = ReferencePool.Acquire<WebJsonData>();
62+
data.URL = url;
63+
data.IsGet = isGet;
64+
data.UserData = userData;
65+
data.UniTaskCompletionStringSource = source;
66+
CopyHeader(data, header);
67+
return data;
7568
}
7669

7770
/// <summary>
78-
/// 初始化Web JSON请求数据(用于带表单的字节数组结果POST请求)
71+
/// 创建用于带表单的字符串结果POST请求数据
7972
/// </summary>
80-
/// <param name="url">请求URL</param>
81-
/// <param name="header">请求头信息</param>
82-
/// <param name="form">表单数据</param>
83-
/// <param name="source">字节数组结果的任务完成源</param>
84-
/// <param name="userData">用户自定义数据</param>
85-
public WebJsonData(string url, Dictionary<string, string> header, Dictionary<string, object> form, TaskCompletionSource<WebBufferResult> source, object userData = null) : base(false, url, userData)
73+
public static WebJsonData Create(string url, Dictionary<string, string> header, Dictionary<string, object> form, TaskCompletionSource<WebStringResult> source, object userData)
8674
{
87-
Header = header;
88-
Form = form;
89-
UniTaskCompletionBytesSource = source;
75+
var data = ReferencePool.Acquire<WebJsonData>();
76+
data.URL = url;
77+
data.IsGet = false;
78+
data.UserData = userData;
79+
data.UniTaskCompletionStringSource = source;
80+
CopyHeader(data, header);
81+
CopyForm(data, form);
82+
return data;
9083
}
9184

9285
/// <summary>
93-
/// 释放资源,取消未完成的任务
86+
/// 创建用于带表单的字节数组结果POST请求数据
9487
/// </summary>
95-
public override void Dispose()
88+
public static WebJsonData Create(string url, Dictionary<string, string> header, Dictionary<string, object> form, TaskCompletionSource<WebBufferResult> source, object userData)
89+
{
90+
var data = ReferencePool.Acquire<WebJsonData>();
91+
data.URL = url;
92+
data.IsGet = false;
93+
data.UserData = userData;
94+
data.UniTaskCompletionBytesSource = source;
95+
CopyHeader(data, header);
96+
CopyForm(data, form);
97+
return data;
98+
}
99+
100+
public override void Clear()
96101
{
97102
if (UniTaskCompletionStringSource != null)
98103
{
99104
UniTaskCompletionStringSource.TrySetCanceled();
105+
UniTaskCompletionStringSource = null;
100106
}
101107

102108
if (UniTaskCompletionBytesSource != null)
103109
{
104110
UniTaskCompletionBytesSource.TrySetCanceled();
111+
UniTaskCompletionBytesSource = null;
112+
}
113+
114+
if (m_Header != null)
115+
{
116+
m_Header.Clear();
117+
}
118+
119+
if (m_Form != null)
120+
{
121+
m_Form.Clear();
122+
}
123+
124+
base.Clear();
125+
}
126+
127+
private static void CopyHeader(WebJsonData data, Dictionary<string, string> header)
128+
{
129+
if (header == null || header.Count == 0)
130+
{
131+
return;
132+
}
133+
134+
if (data.m_Header == null)
135+
{
136+
data.m_Header = new Dictionary<string, string>();
137+
}
138+
else
139+
{
140+
data.m_Header.Clear();
141+
}
142+
143+
foreach (var kv in header)
144+
{
145+
data.m_Header[kv.Key] = kv.Value;
105146
}
147+
}
106148

107-
base.Dispose();
149+
private static void CopyForm(WebJsonData data, Dictionary<string, object> form)
150+
{
151+
if (form == null || form.Count == 0)
152+
{
153+
return;
154+
}
155+
156+
if (data.m_Form == null)
157+
{
158+
data.m_Form = new Dictionary<string, object>();
159+
}
160+
else
161+
{
162+
data.m_Form.Clear();
163+
}
164+
165+
foreach (var kv in form)
166+
{
167+
data.m_Form[kv.Key] = kv.Value;
168+
}
108169
}
109170
}
110171
}
111-
}
172+
}

Runtime/Web/WebManager.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,15 @@ protected override void Shutdown()
113113
while (m_WaitingNormalQueue.Count > 0)
114114
{
115115
var webData = m_WaitingNormalQueue.Dequeue();
116-
webData.Dispose();
116+
ReferencePool.Release(webData);
117117
}
118118

119119
m_WaitingNormalQueue.Clear();
120120
while (m_SendingNormalList.Count > 0)
121121
{
122122
var webData = m_SendingNormalList[0];
123123
m_SendingNormalList.RemoveAt(0);
124-
webData.Dispose();
124+
ReferencePool.Release(webData);
125125
}
126126

127127
m_SendingNormalList.Clear();
@@ -195,7 +195,7 @@ public Task<WebStringResult> GetToString(string url, Dictionary<string, string>
195195
header = MergeHeader(header);
196196
url = UrlHandler(url, queryString);
197197

198-
WebJsonData webJsonData = new WebJsonData(url, header, true, uniTaskCompletionSource, userData);
198+
WebJsonData webJsonData = WebJsonData.Create(url, header, true, uniTaskCompletionSource, userData);
199199
m_WaitingNormalQueue.Enqueue(webJsonData);
200200
return uniTaskCompletionSource.Task;
201201
}
@@ -248,12 +248,14 @@ private async void MakeJsonStringRequest(WebJsonData webJsonData)
248248
Log.Debug($"Web Response: {webJsonData.URL} \n Header: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Header)} \n Form: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Form)} \n Content: {unityWebRequest.error}");
249249
#endif
250250
webJsonData.UniTaskCompletionStringSource.TrySetException(new Exception(unityWebRequest.error));
251+
ReferencePool.Release(webJsonData);
251252
return;
252253
}
253254
#if ENABLE_GAMEFRAMEX_WEB_RECEIVE_LOG
254255
Log.Debug($"Web Response: {webJsonData.URL} \n Header: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Header)} \n Form: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Form)} \n Content: {unityWebRequest.downloadHandler.text}");
255256
#endif
256257
webJsonData.UniTaskCompletionStringSource.SetResult(new WebStringResult(webJsonData.UserData, unityWebRequest.downloadHandler.text));
258+
ReferencePool.Release(webJsonData);
257259
};
258260
#else
259261
try
@@ -324,6 +326,7 @@ private async void MakeJsonStringRequest(WebJsonData webJsonData)
324326
finally
325327
{
326328
m_SendingNormalList.Remove(webJsonData);
329+
ReferencePool.Release(webJsonData);
327330
}
328331
#endif
329332
}
@@ -376,12 +379,14 @@ private async void MakeJsonBytesRequest(WebJsonData webJsonData)
376379
Log.Debug($"Web Response: {webJsonData.URL} \n Header: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Header)} \n Form: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Form)} \n Content: {unityWebRequest.error}");
377380
#endif
378381
webJsonData.UniTaskCompletionBytesSource.TrySetException(new Exception(unityWebRequest.error));
382+
ReferencePool.Release(webJsonData);
379383
return;
380384
}
381385
#if ENABLE_GAMEFRAMEX_WEB_RECEIVE_LOG
382386
Log.Debug($"Web Response: {webJsonData.URL} \n Header: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Header)} \n Form: {GameFrameX.Runtime.Utility.Json.ToJson(webJsonData.Form)} \n Content: {unityWebRequest.downloadHandler.data}");
383387
#endif
384388
webJsonData.UniTaskCompletionBytesSource.SetResult(new WebBufferResult(webJsonData.UserData, unityWebRequest.downloadHandler.data));
389+
ReferencePool.Release(webJsonData);
385390
};
386391
#else
387392
try
@@ -456,6 +461,7 @@ private async void MakeJsonBytesRequest(WebJsonData webJsonData)
456461
finally
457462
{
458463
m_SendingNormalList.Remove(webJsonData);
464+
ReferencePool.Release(webJsonData);
459465
}
460466
#endif
461467
}
@@ -476,7 +482,7 @@ public Task<WebBufferResult> GetToBytes(string url, Dictionary<string, string> q
476482
header = MergeHeader(header);
477483
url = UrlHandler(url, queryString);
478484

479-
WebJsonData webJsonData = new WebJsonData(url, header, true, uniTaskCompletionSource, userData);
485+
WebJsonData webJsonData = WebJsonData.Create(url, header, true, uniTaskCompletionSource, userData);
480486
m_WaitingNormalQueue.Enqueue(webJsonData);
481487
return uniTaskCompletionSource.Task;
482488
}
@@ -553,7 +559,7 @@ public Task<WebStringResult> PostToString(string url, Dictionary<string, object>
553559
header = MergeHeader(header);
554560
url = UrlHandler(url, queryString);
555561

556-
WebJsonData webJsonData = new WebJsonData(url, header, from, uniTaskCompletionSource, userData);
562+
WebJsonData webJsonData = WebJsonData.Create(url, header, from, uniTaskCompletionSource, userData);
557563
m_WaitingNormalQueue.Enqueue(webJsonData);
558564
return uniTaskCompletionSource.Task;
559565
}
@@ -575,7 +581,7 @@ public Task<WebBufferResult> PostToBytes(string url, Dictionary<string, object>
575581
queryString = MergeQueryString(queryString);
576582
header = MergeHeader(header);
577583
url = UrlHandler(url, queryString);
578-
WebJsonData webJsonData = new WebJsonData(url, header, from, uniTaskCompletionSource, userData);
584+
WebJsonData webJsonData = WebJsonData.Create(url, header, from, uniTaskCompletionSource, userData);
579585
m_WaitingNormalQueue.Enqueue(webJsonData);
580586
return uniTaskCompletionSource.Task;
581587
}

0 commit comments

Comments
 (0)