Skip to content

Commit 88b4e76

Browse files
committed
- 补充 ObjectPool Async CancellationToken 参数;#2177
1 parent 04a2d95 commit 88b4e76

File tree

25 files changed

+138
-206
lines changed

25 files changed

+138
-206
lines changed

FreeSql/Internal/CommonProvider/AdoProvider/DbConnectionPool.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ public Object<DbConnection> Get(TimeSpan? timeout = null)
6969

7070
#if net40
7171
#else
72-
async public Task<Object<DbConnection>> GetAsync()
72+
async public Task<Object<DbConnection>> GetAsync(CancellationToken cancellationToken)
7373
{
7474
var conn = _connectionFactory();
7575
if (conn.State != ConnectionState.Open)
76-
await conn.OpenAsync();
76+
await conn.OpenAsync(cancellationToken);
7777
return Object<DbConnection>.InitWith(this, Interlocked.Increment(ref _id), conn);
7878
}
7979
#endif
@@ -128,11 +128,11 @@ public Object<DbConnection> Get(TimeSpan? timeout = null)
128128

129129
#if net40
130130
#else
131-
async public Task<Object<DbConnection>> GetAsync()
131+
async public Task<Object<DbConnection>> GetAsync(CancellationToken cancellationToken)
132132
{
133133
var conn = _connectionFactory();
134134
if (conn.State != ConnectionState.Open)
135-
await conn.OpenAsync();
135+
await conn.OpenAsync(cancellationToken);
136136
return Object<DbConnection>.InitWith(this, Interlocked.Increment(ref _id), conn);
137137
}
138138
#endif
@@ -195,7 +195,7 @@ public void OnGet(Object<DbConnection> obj)
195195

196196
#if net40
197197
#else
198-
public Task OnGetAsync(Object<DbConnection> obj)
198+
public Task OnGetAsync(Object<DbConnection> obj, CancellationToken cancellationToken)
199199
{
200200
return Task.FromResult(true);
201201
}

FreeSql/Internal/ObjectPool/IObjectPool.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23
using System.Threading.Tasks;
34

45
namespace FreeSql.Internal.ObjectPool
@@ -49,7 +50,7 @@ public interface IObjectPool<T> : IDisposable
4950
/// 获取资源
5051
/// </summary>
5152
/// <returns></returns>
52-
Task<Object<T>> GetAsync();
53+
Task<Object<T>> GetAsync(CancellationToken cancellationToken = default);
5354
#endif
5455

5556
/// <summary>

FreeSql/Internal/ObjectPool/IPolicy.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Text;
4+
using System.Threading;
45
using System.Threading.Tasks;
56

67
namespace FreeSql.Internal.ObjectPool
@@ -81,7 +82,7 @@ public interface IPolicy<T>
8182
/// 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
8283
/// </summary>
8384
/// <param name="obj">资源对象</param>
84-
Task OnGetAsync(Object<T> obj);
85+
Task OnGetAsync(Object<T> obj, CancellationToken cancellationToken);
8586
#endif
8687

8788
/// <summary>

FreeSql/Internal/ObjectPool/ObjectPool.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ public Object<T> Get(TimeSpan? timeout = null)
366366

367367
#if net40
368368
#else
369-
async public Task<Object<T>> GetAsync()
369+
async public Task<Object<T>> GetAsync(CancellationToken cancellationToken)
370370
{
371371
var obj = GetFree(true);
372372
if (obj == null)
@@ -400,7 +400,7 @@ async public Task<Object<T>> GetAsync()
400400

401401
try
402402
{
403-
await Policy.OnGetAsync(obj);
403+
await Policy.OnGetAsync(obj, cancellationToken);
404404
}
405405
catch
406406
{

Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
using FreeSql.Internal.ObjectPool;
1+
using ClickHouse.Driver.ADO;
2+
using FreeSql.Internal.ObjectPool;
23
using System;
34
using System.Collections.Concurrent;
4-
using System.Collections.Generic;
55
using System.Data;
66
using System.Data.Common;
77
using System.Text.RegularExpressions;
8+
using System.Threading;
89
using System.Threading.Tasks;
9-
using ClickHouse.Driver.ADO;
1010

1111
namespace FreeSql.ClickHouse
1212
{
@@ -154,7 +154,7 @@ public void OnGet(Object<DbConnection> obj)
154154

155155
#if net40
156156
#else
157-
async public Task OnGetAsync(Object<DbConnection> obj)
157+
async public Task OnGetAsync(Object<DbConnection> obj, CancellationToken cancellationToken)
158158
{
159159

160160
if (_pool.IsAvailable)
@@ -165,12 +165,12 @@ async public Task OnGetAsync(Object<DbConnection> obj)
165165
throw new Exception(CoreErrorStrings.S_ConnectionStringError_Check(this.Name));
166166
}
167167

168-
if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync()) == false)
168+
if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync(false, cancellationToken)) == false)
169169
{
170170

171171
try
172172
{
173-
await obj.Value.OpenAsync();
173+
await obj.Value.OpenAsync(cancellationToken);
174174
}
175175
catch (Exception ex)
176176
{
@@ -231,11 +231,11 @@ public static bool Ping(this DbConnection that, bool isThrow = false)
231231

232232
#if net40
233233
#else
234-
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false)
234+
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false, CancellationToken cancellationToken = default)
235235
{
236236
try
237237
{
238-
await PingCommand(that).ExecuteNonQueryAsync();
238+
await PingCommand(that).ExecuteNonQueryAsync(cancellationToken);
239239
return true;
240240
}
241241
catch

Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Data;
66
using System.Data.Common;
77
using System.Text.RegularExpressions;
8+
using System.Threading;
89
using System.Threading.Tasks;
910

1011
namespace FreeSql.Dameng
@@ -153,7 +154,7 @@ public void OnGet(Object<DbConnection> obj)
153154

154155
#if net40
155156
#else
156-
async public Task OnGetAsync(Object<DbConnection> obj)
157+
async public Task OnGetAsync(Object<DbConnection> obj, CancellationToken cancellationToken)
157158
{
158159

159160
if (_pool.IsAvailable)
@@ -164,12 +165,12 @@ async public Task OnGetAsync(Object<DbConnection> obj)
164165
throw new Exception(CoreErrorStrings.S_ConnectionStringError_Check(this.Name));
165166
}
166167

167-
if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync()) == false)
168+
if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync(false, cancellationToken)) == false)
168169
{
169170

170171
try
171172
{
172-
await obj.Value.OpenAsync();
173+
await obj.Value.OpenAsync(cancellationToken);
173174
}
174175
catch (Exception ex)
175176
{
@@ -230,11 +231,11 @@ public static bool Ping(this DbConnection that, bool isThrow = false)
230231

231232
#if net40
232233
#else
233-
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false)
234+
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false, CancellationToken cancellationToken = default)
234235
{
235236
try
236237
{
237-
await PingCommand(that).ExecuteNonQueryAsync();
238+
await PingCommand(that).ExecuteNonQueryAsync(cancellationToken);
238239
return true;
239240
}
240241
catch

Providers/FreeSql.Provider.Duckdb/DuckdbAdo/DuckdbConnectionPool.cs

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Linq;
77
using System.Text;
88
using System.Text.RegularExpressions;
9+
using System.Threading;
910
using System.Threading.Tasks;
1011

1112
namespace FreeSql.Duckdb
@@ -126,7 +127,7 @@ public void OnGet(Object<DbConnection> obj)
126127

127128
#if net40
128129
#else
129-
async public Task OnGetAsync(Object<DbConnection> obj)
130+
async public Task OnGetAsync(Object<DbConnection> obj, CancellationToken cancellationToken)
130131
{
131132

132133
if (_pool.IsAvailable)
@@ -135,7 +136,7 @@ async public Task OnGetAsync(Object<DbConnection> obj)
135136
throw new Exception(CoreErrorStrings.S_ConnectionStringError_Check(this.Name));
136137

137138
if (obj.Value.State != ConnectionState.Open)
138-
await obj.Value.OpenAndAttachAsync(Attaches);
139+
await obj.Value.OpenAndAttachAsync(Attaches, cancellationToken);
139140
}
140141
}
141142
#endif
@@ -206,26 +207,9 @@ public static void OpenAndAttach(this DbConnection that, string[] attach)
206207

207208
#if net40
208209
#else
209-
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false)
210+
async public static Task OpenAndAttachAsync(this DbConnection that, string[] attach, CancellationToken cancellationToken = default)
210211
{
211-
try
212-
{
213-
using (var cmd = PingCommand(that))
214-
{
215-
await cmd.ExecuteNonQueryAsync();
216-
}
217-
return true;
218-
}
219-
catch
220-
{
221-
if (that.State != ConnectionState.Closed) try { that.Close(); } catch { }
222-
if (isThrow) throw;
223-
return false;
224-
}
225-
}
226-
async public static Task OpenAndAttachAsync(this DbConnection that, string[] attach)
227-
{
228-
await that.OpenAsync();
212+
await that.OpenAsync(cancellationToken);
229213

230214
if (attach?.Any() == true)
231215
{
@@ -235,7 +219,7 @@ async public static Task OpenAndAttachAsync(this DbConnection that, string[] att
235219

236220
var cmd = that.CreateCommand();
237221
cmd.CommandText = sb.ToString();
238-
await cmd.ExecuteNonQueryAsync();
222+
await cmd.ExecuteNonQueryAsync(cancellationToken);
239223
cmd.Dispose();
240224
}
241225
}

Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
using FreeSql.Internal.ObjectPool;
33
using System;
44
using System.Collections.Concurrent;
5-
using System.Collections.Generic;
65
using System.Data;
76
using System.Data.Common;
87
using System.Text.RegularExpressions;
8+
using System.Threading;
99
using System.Threading.Tasks;
1010

1111
namespace FreeSql.Firebird
@@ -124,7 +124,7 @@ public void OnGet(Object<DbConnection> obj)
124124

125125
#if net40
126126
#else
127-
async public Task OnGetAsync(Object<DbConnection> obj)
127+
async public Task OnGetAsync(Object<DbConnection> obj, CancellationToken cancellationToken)
128128
{
129129

130130
if (_pool.IsAvailable)
@@ -133,7 +133,7 @@ async public Task OnGetAsync(Object<DbConnection> obj)
133133
throw new Exception(CoreErrorStrings.S_ConnectionStringError_Check(this.Name));
134134

135135
if (obj.Value.State != ConnectionState.Open)
136-
await obj.Value.OpenAsync();
136+
await obj.Value.OpenAsync(cancellationToken);
137137
}
138138
}
139139
#endif
@@ -183,23 +183,5 @@ public static bool Ping(this DbConnection that, bool isThrow = false)
183183
return false;
184184
}
185185
}
186-
187-
#if net40
188-
#else
189-
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false)
190-
{
191-
try
192-
{
193-
await PingCommand(that).ExecuteNonQueryAsync();
194-
return true;
195-
}
196-
catch
197-
{
198-
if (that.State != ConnectionState.Closed) try { that.Close(); } catch { }
199-
if (isThrow) throw;
200-
return false;
201-
}
202-
}
203-
#endif
204186
}
205187
}

Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using FreeSql.Internal.ObjectPool;
22
using System;
33
using System.Collections.Concurrent;
4-
using System.Collections.Generic;
54
using System.Data;
65
using System.Data.Common;
76
using System.Data.Odbc;
87
using System.Text.RegularExpressions;
8+
using System.Threading;
99
using System.Threading.Tasks;
1010

1111
namespace FreeSql.GBase
@@ -143,7 +143,7 @@ public void OnGet(Object<DbConnection> obj)
143143

144144
#if net40
145145
#else
146-
async public Task OnGetAsync(Object<DbConnection> obj)
146+
async public Task OnGetAsync(Object<DbConnection> obj, CancellationToken cancellationToken)
147147
{
148148

149149
if (_pool.IsAvailable)
@@ -154,12 +154,12 @@ async public Task OnGetAsync(Object<DbConnection> obj)
154154
throw new Exception(CoreErrorStrings.S_ConnectionStringError_Check(this.Name));
155155
}
156156

157-
if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync()) == false)
157+
if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync(false, cancellationToken)) == false)
158158
{
159159

160160
try
161161
{
162-
await obj.Value.OpenAsync();
162+
await obj.Value.OpenAsync(cancellationToken);
163163
}
164164
catch (Exception ex)
165165
{
@@ -220,11 +220,11 @@ public static bool Ping(this DbConnection that, bool isThrow = false)
220220

221221
#if net40
222222
#else
223-
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false)
223+
async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false, CancellationToken cancellationToken = default)
224224
{
225225
try
226226
{
227-
await PingCommand(that).ExecuteNonQueryAsync();
227+
await PingCommand(that).ExecuteNonQueryAsync(cancellationToken);
228228
return true;
229229
}
230230
catch

0 commit comments

Comments
 (0)