From 4a85488bf2e88b466be1f894ee91f0b09b4cc1df Mon Sep 17 00:00:00 2001 From: Erling Damsgaard Date: Thu, 30 Jan 2025 14:29:03 +0100 Subject: [PATCH] Added prediction of Semapore locking. --- src/Simple.OData.Client.Core/Http/RequestRunner.cs | 5 +++++ src/Simple.OData.Client.Core/IODataClient.cs | 5 +++++ src/Simple.OData.Client.Core/ODataClient.cs | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/src/Simple.OData.Client.Core/Http/RequestRunner.cs b/src/Simple.OData.Client.Core/Http/RequestRunner.cs index e376c508..74a0626d 100644 --- a/src/Simple.OData.Client.Core/Http/RequestRunner.cs +++ b/src/Simple.OData.Client.Core/Http/RequestRunner.cs @@ -19,6 +19,11 @@ public RequestRunner(ISession session) } } + public bool WillLock() + { + return (_semaphore != null ? (_semaphore.CurrentCount > 0 ? false : true) : false); + } + public async Task ExecuteRequestAsync(ODataRequest request, CancellationToken cancellationToken) { if (_maxConcurrentRequests > 0 && _semaphore is not null) diff --git a/src/Simple.OData.Client.Core/IODataClient.cs b/src/Simple.OData.Client.Core/IODataClient.cs index 458774ee..4d06f69c 100644 --- a/src/Simple.OData.Client.Core/IODataClient.cs +++ b/src/Simple.OData.Client.Core/IODataClient.cs @@ -606,4 +606,9 @@ public interface IODataClient Task ExecuteActionAsArrayAsync(string actionName, IDictionary parameters, CancellationToken cancellationToken); Task GetResponseAsync(ODataRequest request); Task GetResponseAsync(ODataRequest request, CancellationToken cancellationToken); + /// + /// Tests wether there is any available threads (semaphores) to process. + /// + /// true if any call will cause a lock by the call + bool NextCallWillLock(); } diff --git a/src/Simple.OData.Client.Core/ODataClient.cs b/src/Simple.OData.Client.Core/ODataClient.cs index fe8ef052..f0acac27 100644 --- a/src/Simple.OData.Client.Core/ODataClient.cs +++ b/src/Simple.OData.Client.Core/ODataClient.cs @@ -197,4 +197,11 @@ public void UpdateRequestHeaders(Dictionary> headers } }; } + + /// + /// Tests wether there is any available threads (semaphores) to process. + /// + /// true if any call will cause a lock by the call + bool IODataClient.NextCallWillLock() => _requestRunner.WillLock(); + }