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);
|
_waiters.Enqueue(tcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CancellationTokenSource? delayCts = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
if (timeout.HasValue || ct.CanBeCanceled)
|
if (timeout.HasValue || ct.CanBeCanceled)
|
||||||
{
|
{
|
||||||
// Wait for either timeout, cancellation token or set result
|
delayCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
|
||||||
var delayTask = Task.Delay(timeout ?? Timeout.InfiniteTimeSpan, ct);
|
|
||||||
var completedTask = await Task.WhenAny(tcs.Task, delayTask).ConfigureAwait(false);
|
var delayTask = Task.Delay(
|
||||||
|
timeout ?? Timeout.InfiniteTimeSpan,
|
||||||
|
delayCts.Token);
|
||||||
|
|
||||||
|
var completedTask =
|
||||||
|
await Task.WhenAny(tcs.Task, delayTask)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
if (completedTask != tcs.Task)
|
if (completedTask != tcs.Task)
|
||||||
{
|
{
|
||||||
// This was a timeout or cancellation, need to remove tcs from waiters
|
// 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 the tcs was set instead it will be removed in the Set method
|
||||||
|
|
||||||
if (tcs.TrySetResult(false))
|
if (tcs.TrySetResult(false))
|
||||||
{
|
{
|
||||||
lock (_waitersLock)
|
lock (_waitersLock)
|
||||||
@ -89,6 +98,13 @@ namespace CryptoExchange.Net.Objects
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// Actively stop the delay if tcs.Task won
|
||||||
|
delayCts?.Cancel();
|
||||||
|
delayCts?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Signal a waiter
|
/// Signal a waiter
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user