Ich enthülle eine API -Methode, die die Anforderung von der Client -App akzeptiert. Diese Anfrage wird an eine andere COM -Bibliothek gesendet, in der sie validiert wird. Basierend auf den Anforderungsdaten kann die Validierung die Antwort auf meinen API -Controller verzögern und zurückgeben. Sobald es validiert wurde, wählen Sie die nächste Anfrage aus der Warteschlange (falls etwas, das während der vorherigen Anfrage erhalten wurde) für denselben Validierungsprozess. < /p>
class ApiController : ControllerBase
{
private readonly ConcurrentQueue _requestQueue = new ConcurrentQueue();
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
private bool _isProcessing = false;
private readonly object _lock = new object();
public async Task Validate(RequestModel requestModel)
{
_requestQueue.Enqueue(requestModel);
lock (_lock)
{
if (_isProcessing)
{
return;
}
_isProcessing = true;
}
Task.Run(
async () =>
{
while (_requestQueue.TryDequeue(out var request))
{
await _semaphore.WaitAsync();
// call COM library with request data
_semaphore.Release();
}
lock (_lock)
{
_isProcessing = false;
}
});
}
}
< /code>
hat diesen Code ausprobiert, funktioniert aber nicht. Wenn die 1. Anfrage mehr Zeit benötigt, um zu validieren, und die 2. Anfrage vor dem 1. validiert werden.
Ich enthülle eine API -Methode, die die Anforderung von der Client -App akzeptiert. Diese Anfrage wird an eine andere COM -Bibliothek gesendet, in der sie validiert wird. Basierend auf den Anforderungsdaten kann die Validierung die Antwort auf meinen API -Controller verzögern und zurückgeben. Sobald es validiert wurde, wählen Sie die nächste Anfrage aus der Warteschlange (falls etwas, das während der vorherigen Anfrage erhalten wurde) für denselben Validierungsprozess. < /p> class ApiController : ControllerBase { private readonly ConcurrentQueue _requestQueue = new ConcurrentQueue(); private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
private bool _isProcessing = false;
private readonly object _lock = new object();
public async Task Validate(RequestModel requestModel) { _requestQueue.Enqueue(requestModel); lock (_lock) { if (_isProcessing) { return; } _isProcessing = true; } Task.Run( async () => { while (_requestQueue.TryDequeue(out var request)) { await _semaphore.WaitAsync(); // call COM library with request data _semaphore.Release(); } lock (_lock) { _isProcessing = false; } }); } } < /code> hat diesen Code ausprobiert, funktioniert aber nicht. Wenn die 1. Anfrage mehr Zeit benötigt, um zu validieren, und die 2. Anfrage vor dem 1. validiert werden.
(Änderungen unten)
Ich suche nach einer Möglichkeit, ein paar SQL -Abfragen in sequentieller Reihenfolge zu senden, aber in einem anderen Thread auszuführen, damit die Anwendung nicht für den...
Ich habe eine PHP-Website, die von meinem Raspberry Pi 4 mit 8 GB RAM und Apache2 gehostet wird. Es ist nur eine Website, die die Uhrzeit anzeigt, während im Hintergrund Videos abgespielt werden. Die...
Ich arbeite an einer Electron-App und versuche, mit fs.promises.writeFile() in einer asynchronen Funktion mehrere Dateien gleichzeitig aus einer Ordnerstruktur herunterzuladen, aber die Dateien...
Ich schreibe eine Gstreamer-Pipeline mit PyGST und Gst.parse_launch, die auf einem Nvidia Jetson Nano läuft. Die Pipeline spielt 4K-Videos ab und blendet die Videos zur Laufzeit ein und aus.
Mein...
Verwenden von Unity Web Request kann ich einen Download starten, das Quest -Headset abnehmen und dieser Download wird fertig sein. Es wird den nächsten Download nicht speichern oder starten. Wie...