mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2026-02-16 14:13:46 +00:00
Added timeout/ct task cleanup AsyncResetEvent
This commit is contained in:
parent
40d480e1fc
commit
4a79ce22ec
@ -53,17 +53,26 @@ namespace CryptoExchange.Net.Objects
|
||||
_waiters.Enqueue(tcs);
|
||||
}
|
||||
|
||||
CancellationTokenSource? delayCts = null;
|
||||
|
||||
try
|
||||
{
|
||||
if (timeout.HasValue || ct.CanBeCanceled)
|
||||
{
|
||||
// Wait for either timeout, cancellation token or set result
|
||||
var delayTask = Task.Delay(timeout ?? Timeout.InfiniteTimeSpan, ct);
|
||||
var completedTask = await Task.WhenAny(tcs.Task, delayTask).ConfigureAwait(false);
|
||||
delayCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
|
||||
|
||||
var delayTask = Task.Delay(
|
||||
timeout ?? Timeout.InfiniteTimeSpan,
|
||||
delayCts.Token);
|
||||
|
||||
var completedTask =
|
||||
await Task.WhenAny(tcs.Task, delayTask)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
if (completedTask != tcs.Task)
|
||||
{
|
||||
// This was a timeout or cancellation, need to remove tcs from waiters
|
||||
// if the tcs was set instead it will be removed in the Set method
|
||||
|
||||
if (tcs.TrySetResult(false))
|
||||
{
|
||||
lock (_waitersLock)
|
||||
@ -89,6 +98,13 @@ namespace CryptoExchange.Net.Objects
|
||||
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Actively stop the delay if tcs.Task won
|
||||
delayCts?.Cancel();
|
||||
delayCts?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Signal a waiter
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user