Skip to content

Commit f29946d

Browse files
committed
* Create CancellationToken in internal CloseAsync method. Thanks @JanEggers
1 parent eadabd3 commit f29946d

File tree

2 files changed

+25
-32
lines changed

2 files changed

+25
-32
lines changed

projects/RabbitMQ.Client/IConnectionExtensions.cs

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,10 @@ public static Task CloseAsync(this IConnection connection, ushort reasonCode, st
5959
/// To wait infinitely for the close operations to complete use <see cref="System.Threading.Timeout.InfiniteTimeSpan"/>.
6060
/// </para>
6161
/// </remarks>
62-
public static async Task CloseAsync(this IConnection connection, TimeSpan timeout)
62+
public static Task CloseAsync(this IConnection connection, TimeSpan timeout)
6363
{
64-
using var cts = new CancellationTokenSource(timeout);
65-
await connection.CloseAsync(Constants.ReplySuccess, "Goodbye", timeout, false, cts.Token)
66-
.ConfigureAwait(false);
64+
return connection.CloseAsync(Constants.ReplySuccess, "Goodbye", timeout, false,
65+
CancellationToken.None);
6766
}
6867

6968
/// <summary>
@@ -83,11 +82,10 @@ await connection.CloseAsync(Constants.ReplySuccess, "Goodbye", timeout, false, c
8382
/// Operation timeout.
8483
/// </para>
8584
/// </remarks>
86-
public static async Task CloseAsync(this IConnection connection, ushort reasonCode, string reasonText, TimeSpan timeout)
85+
public static Task CloseAsync(this IConnection connection, ushort reasonCode, string reasonText, TimeSpan timeout)
8786
{
88-
using var cts = new CancellationTokenSource(timeout);
89-
await connection.CloseAsync(reasonCode, reasonText, timeout, false, cts.Token)
90-
.ConfigureAwait(false);
87+
return connection.CloseAsync(reasonCode, reasonText, timeout, false,
88+
CancellationToken.None);
9189
}
9290

9391
/// <summary>
@@ -99,12 +97,10 @@ await connection.CloseAsync(reasonCode, reasonText, timeout, false, cts.Token)
9997
/// <see cref="IOException"/> during closing connection.
10098
///This method waits infinitely for the in-progress close operation to complete.
10199
/// </remarks>
102-
public static async Task AbortAsync(this IConnection connection)
100+
public static Task AbortAsync(this IConnection connection)
103101
{
104-
using var cts = new CancellationTokenSource(InternalConstants.DefaultConnectionAbortTimeout);
105-
await connection.CloseAsync(Constants.ReplySuccess,
106-
"Connection close forced", InternalConstants.DefaultConnectionAbortTimeout, true, cts.Token)
107-
.ConfigureAwait(false);
102+
return connection.CloseAsync(Constants.ReplySuccess, "Connection close forced", InternalConstants.DefaultConnectionAbortTimeout, true,
103+
CancellationToken.None);
108104
}
109105

110106
/// <summary>
@@ -120,12 +116,10 @@ await connection.CloseAsync(Constants.ReplySuccess,
120116
/// A message indicating the reason for closing the connection
121117
/// </para>
122118
/// </remarks>
123-
public static async Task AbortAsync(this IConnection connection, ushort reasonCode, string reasonText)
119+
public static Task AbortAsync(this IConnection connection, ushort reasonCode, string reasonText)
124120
{
125-
using var cts = new CancellationTokenSource(InternalConstants.DefaultConnectionAbortTimeout);
126-
await connection.CloseAsync(reasonCode,
127-
reasonText, InternalConstants.DefaultConnectionAbortTimeout, true, cts.Token)
128-
.ConfigureAwait(false);
121+
return connection.CloseAsync(reasonCode, reasonText, InternalConstants.DefaultConnectionAbortTimeout, true,
122+
CancellationToken.None);
129123
}
130124

131125
/// <summary>
@@ -141,12 +135,10 @@ await connection.CloseAsync(reasonCode,
141135
/// To wait infinitely for the close operations to complete use <see cref="Timeout.Infinite"/>.
142136
/// </para>
143137
/// </remarks>
144-
public static async Task AbortAsync(this IConnection connection, TimeSpan timeout)
138+
public static Task AbortAsync(this IConnection connection, TimeSpan timeout)
145139
{
146-
using var cts = new CancellationTokenSource(InternalConstants.DefaultConnectionAbortTimeout);
147-
await connection.CloseAsync(Constants.ReplySuccess,
148-
"Connection close forced", timeout, true, cts.Token)
149-
.ConfigureAwait(false);
140+
return connection.CloseAsync(Constants.ReplySuccess, "Connection close forced", timeout, true,
141+
CancellationToken.None);
150142
}
151143

152144
/// <summary>
@@ -163,12 +155,10 @@ await connection.CloseAsync(Constants.ReplySuccess,
163155
/// A message indicating the reason for closing the connection.
164156
/// </para>
165157
/// </remarks>
166-
public static async Task AbortAsync(this IConnection connection, ushort reasonCode, string reasonText, TimeSpan timeout)
158+
public static Task AbortAsync(this IConnection connection, ushort reasonCode, string reasonText, TimeSpan timeout)
167159
{
168-
using var cts = new CancellationTokenSource(InternalConstants.DefaultConnectionAbortTimeout);
169-
await connection.CloseAsync(reasonCode,
170-
reasonText, timeout, true, cts.Token)
171-
.ConfigureAwait(false);
160+
return connection.CloseAsync(reasonCode, reasonText, timeout, true,
161+
CancellationToken.None);
172162
}
173163
}
174164
}

projects/RabbitMQ.Client/Impl/Connection.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,9 @@ public Task CloseAsync(ushort reasonCode, string reasonText, TimeSpan timeout, b
320320
///</remarks>
321321
internal async Task CloseAsync(ShutdownEventArgs reason, bool abort, TimeSpan timeout, CancellationToken cancellationToken)
322322
{
323+
using var timeoutCts = new CancellationTokenSource(timeout);
324+
using var cts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken);
325+
323326
if (false == SetCloseReason(reason))
324327
{
325328
// close reason is already set
@@ -332,7 +335,7 @@ internal async Task CloseAsync(ShutdownEventArgs reason, bool abort, TimeSpan ti
332335
{
333336
await OnShutdownAsync(reason)
334337
.ConfigureAwait(false);
335-
await _session0.SetSessionClosingAsync(false, cancellationToken)
338+
await _session0.SetSessionClosingAsync(false, cts.Token)
336339
.ConfigureAwait(false);
337340

338341
try
@@ -341,7 +344,7 @@ await _session0.SetSessionClosingAsync(false, cancellationToken)
341344
if (false == _closed)
342345
{
343346
var method = new ConnectionClose(reason.ReplyCode, reason.ReplyText, 0, 0);
344-
await _session0.TransmitAsync(method, cancellationToken)
347+
await _session0.TransmitAsync(method, cts.Token)
345348
.ConfigureAwait(false);
346349
}
347350
}
@@ -390,14 +393,14 @@ await _session0.TransmitAsync(method, cancellationToken)
390393

391394
try
392395
{
393-
await _mainLoopTask.WaitAsync(timeout, cancellationToken)
396+
await _mainLoopTask.WaitAsync(timeout, cts.Token)
394397
.ConfigureAwait(false);
395398
}
396399
catch
397400
{
398401
try
399402
{
400-
await _frameHandler.CloseAsync(cancellationToken)
403+
await _frameHandler.CloseAsync(cts.Token)
401404
.ConfigureAwait(false);
402405
}
403406
catch

0 commit comments

Comments
 (0)